问这个问题我感觉很傻,但我一直在想这个问题,但我找不到任何答案。
所以问题是:为什么应用仿函数可以有副作用,但仿函数不能?
也许他们可以,而我只是从未注意到...?
最佳答案
Functor
是不正确的。 s 没有效果。每Applicative
(以及每个 Monad
到 WrappedMonad
)是 Functor
.主要区别在于 Applicative
和 Monad
给你工具如何处理这些效果,如何组合它们。大致
Applicative
允许您对效果进行排序并在其中组合值。 Monad
此外,您还可以根据前一个效果的结果确定下一个效果。 然而
Functor
只允许你修改里面的值,它不给工具做任何效果。因此,如果某事只是 Functor
而不是 Applicative
,这并不意味着它没有效果。它只是没有一种机制如何以这种方式组合它们。更新:例如,考虑
import Control.Applicative
newtype MyF r a = MyF (IO (r, a))
instance Functor (MyF r) where
fmap f (MyF x) = MyF $ fmap (fmap f) x
这显然是
Functor
携带效果的实例。只是我们没有办法定义符合 Applicative
的这些效果的操作。 .除非我们对 r
施加一些额外的限制。 ,无法定义Applicative
实例。
关于haskell - 为什么应用仿函数可以有副作用,但仿函数不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576543/