nor*_*ane 10 monads haskell functional-programming
考虑到表达式:
[0,1..] >>= \i -> [i * 2]
Run Code Online (Sandbox Code Playgroud)
在>>=for List 的定义中,lambda函数\i -> [i * 2]通过fmap映射到list参数,从而生成列表列表[[0], [2]..].因此>>=需要使用join函数展平结果以返回列表:[0, 2..]
根据这个来源:"...根据fmap和join的定义,适用于每个monad m:ma >>= k = join $ fmap k ma"
那么为什么有必要将提供monad的负担放在提供给>> =的函数上?为什么不简单地定义bind呢?
ma >>= k = fmap k ma
Run Code Online (Sandbox Code Playgroud)
这样您就不必处理扁平化结果.
Fyo*_*kin 14
您提议的是简单地将绑定运算符定义为等于fmap,但是使用参数交换:
ma >>= k = fmap k ma
-- is equivalent to:
(>>=) = flip fmap
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么不只是使用fmap自身或其运算符形式<$>?
(*2) <$> [0,1..]
> [0,2,4,6,...]
Run Code Online (Sandbox Code Playgroud)
但是,这并未涵盖可能使用的所有情况bind.不同之处在于monad比functor更强大.仿函数只允许你为每个输入产生一个输出,monads让你做各种疯狂的事情.
例如,考虑以下因素:
[0,1,2,3] >>= \i -> [i*2, i*3]
> [0,0,2,3,4,6,6,9]
Run Code Online (Sandbox Code Playgroud)
这里,函数为每个输入生成两个值.这不能仅通过表达来表达fmap.这需要join得到的结果值.
这是另一个更不明显的例子:
[0,1,2,3,4,5] >>= \i -> if i `mod` 2 == 0 then [] else [i]
> [1,3,5]
Run Code Online (Sandbox Code Playgroud)
这里,函数产生一个值或不产生值.从技术上讲,空列表仍然是List monad中的值,但是无法通过fmap输入获得它.
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |