gpt4 book ai didi

haskell - 如何证明单子(monad)是一个仿函数和一个应用仿函数?

转载 作者:行者123 更新时间:2023-12-03 02:19:59 24 4
gpt4 key购买 nike

理论上,Monad 是仿函数和特定应用仿函数的子集,尽管 Haskell 的类型系统中没有指出这一点。

知道这一点,给定一个 monad 并基于 returnbind ,如何:

  • 导出fmap ,
  • 导出<*>

最佳答案

嗯,fmap只是 (a -> b) -> f a -> f b ,即我们想用纯函数转换一元 Action 的结果。使用 do 表示法很容易编写:

fmap f m = do
a <- m
return (f a)

或者,写成“原始”:

fmap f m = m >>= \a -> return (f a)

这可用作 Control.Monad.liftM .

pure :: a -> f a当然是return(<*>) :: f (a -> b) -> f a -> f b有点棘手。我们有一个返回函数的操作,还有一个返回其参数的操作,并且我们希望有一个返回其结果的操作。再次用 do 表示法:

mf <*> mx = do
f <- mf
x <- mx
return (f x)

或者,脱糖:

mf <*> mx =
mf >>= \f ->
mx >>= \x ->
return (f x)

田田!这可通过 Control.Monad.ap 获得。 ,所以我们可以给出 Functor 的完整实例和Applicative对于任何单子(monad) M如下:

instance Functor M where
fmap = liftM

instance Applicative M where
pure = return
(<*>) = ap

理想情况下,我们能够直接在Monad中指定这些实现。 ,减轻为每个 monad 定义单独实例的负担,例如 this proposal 。如果发生这种情况,那么创建Applicative就不存在真正的障碍了。 Monad 的父类(super class),因为它将确保它不会破坏任何现有代码。另一方面,这意味着定义 Functor 涉及的样板文件和Applicative给定 Monad 的实例是最小的,所以很容易成为一个“好公民”(并且应该为任何 monad 定义这样的实例)。

关于haskell - 如何证明单子(monad)是一个仿函数和一个应用仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com