2016-08-24 37 views
1

我在努力弄清楚concatMap如何与=<<运营商相关。可能有人请解释原因:Haskell concatMap点免费说明

f x = concatMap g $ take 5 $ x

成为

f = (g =<<) . take 5

自由点。我可以看到concatMap=<<的匹配类型,但我不明白为什么。

+2

'f = concatMap g。拿5'也是免费的。 'a >> = f'是'concatMap f a',因为这是列表monad的定义。 – Ryan

回答

3

=<<concatMap的替换与无自由度无关。

>>=对列表被定义为的concatmap(其又相当于concatMap)的组合:

xs >>= f = concat (map f xs) 

=<<当然的,并且只是>>=翻转。

对列表的单子实例的解释可以在:https://en.wikibooks.org/wiki/Haskell/Understanding_monads/List

+1

是的,我的问题被问得不好。只是读你写的东西..谢谢。读一下你写的东西,这是否也是一种很好的方式来考虑它'concatMap'是'join fmap'的列表(实际上是所有单子) – matthias

+0

@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)。 –