2016-08-24 51 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)。 –