haskell - 为什么应用仿函数可以有副作用,但仿函数不能?

标签 haskell monads side-effects applicative

问这个问题我感觉很傻,但我一直在想这个问题,但我找不到任何答案。

所以问题是:为什么应用仿函数可以有副作用,但仿函数不能?

也许他们可以,而我只是从未注意到...?

最佳答案

Functor 是不正确的。 s 没有效果。每Applicative (以及每个 Monad WrappedMonad )是 Functor .主要区别在于 ApplicativeMonad给你工具如何处理这些效果,如何组合它们。大致

  • 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/

    相关文章:

    python side_effect - 方法的模拟行为

    haskell - 无法将预期类型 ‘[Integer]’ 与实际类型 ‘Integer’ 匹配

    haskell - Data.ByteString.Lazy.Internal.ByteString 到字符串?

    haskell - PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    haskell - 如何编写派生类?

    scala - 在scala中堆叠Monad Transformers

    haskell - 如何让 ReaderT 与另一个 monad 转换器一起工作?

    language-agnostic - 单子(monad)——它们在哪里是必要的?

    c - 是 a[i]=y++; a[i++]=y;未定义的行为或未在 C 语言中指定?

    haskell - 函数式编程: Where does the side effect actually happen?