我在努力弄清楚concatMap
如何与=<<
运营商相关。可能有人请解释原因:Haskell concatMap点免费说明
f x = concatMap g $ take 5 $ x
成为
f = (g =<<) . take 5
自由点。我可以看到concatMap
和=<<
的匹配类型,但我不明白为什么。
我在努力弄清楚concatMap
如何与=<<
运营商相关。可能有人请解释原因:Haskell concatMap点免费说明
f x = concatMap g $ take 5 $ x
成为
f = (g =<<) . take 5
自由点。我可以看到concatMap
和=<<
的匹配类型,但我不明白为什么。
=<<
对concatMap
的替换与无自由度无关。
>>=
对列表被定义为的concat
和map
(其又相当于concatMap
)的组合:
xs >>= f = concat (map f xs)
=<<
当然的,并且只是>>=
翻转。
对列表的单子实例的解释可以在:https://en.wikibooks.org/wiki/Haskell/Understanding_monads/List
是的,我的问题被问得不好。只是读你写的东西..谢谢。读一下你写的东西,这是否也是一种很好的方式来考虑它'concatMap'是'join fmap'的列表(实际上是所有单子) – matthias
@matthias'concatMap = concat。:map =(concat )。 map',定义为'map = fmap'和'concat = join',如此。并且,通常,[((g <= f)= <<)=(g = <<)。(f = <<)= join。(g <$>).join。(f <$>)']( http://stackoverflow.com/questions/11234632/monads-with-join-instead-of-bind/11249714#11249714)。 –
'f = concatMap g。拿5'也是免费的。 'a >> = f'是'concatMap f a',因为这是列表monad的定义。 – Ryan