我剛開始學習Haskell在幾個星期前,我看到了這一點:這是如何阻止工作的?
moves = do
f <- [(+), subtract]
g <- [(+), subtract]
(x, y) <- [(1, 2), (2, 1)]
[f x *** g y]
我還沒有看到一個do
塊之前,這是一個解決騎士巡邏問題的一部分,在list
結束..有人可以解釋它是如何工作的?
我剛開始學習Haskell在幾個星期前,我看到了這一點:這是如何阻止工作的?
moves = do
f <- [(+), subtract]
g <- [(+), subtract]
(x, y) <- [(1, 2), (2, 1)]
[f x *** g y]
我還沒有看到一個do
塊之前,這是一個解決騎士巡邏問題的一部分,在list
結束..有人可以解釋它是如何工作的?
你必須解除符號。首先開始寫下類型:
import Control.Arrow
moves :: [(Integer, Integer) -> (Integer, Integer)]
moves = do
f <- [(+), subtract]
g <- [(+), subtract]
(x, y) <- [(1, 2), (2, 1)]
[f x *** g y]
所以我們在[]
(名單)單子。
查找Monad []定義:
instance Monad [] where
m >>= k = foldr ((++) . k) [] m
m >> k = foldr ((++) . (\ _ -> k)) [] m
return x = [x]
並翻譯做記號結合並返回:在他們的定義而言
moves =
[(+), subtract] >>= \f ->
[(+), subtract] >>= \g ->
[(1, 2), (2, 1)] >>= \(x,y) ->
[f x *** g y]
然後,終於,改寫結合:
由return
上榜
定義>> =的>> =的>>
moves =
foldr ((++) . (\f ->
foldr ((++) . (\g ->
[(1, 2), (2, 1)] >>= \(x,y) ->
return (f x *** g y))
) [] [(+), subtract]
)) [] [(+), subtract]
定義=
moves =
foldr ((++) . (\f ->
[(+), subtract] >>= \g ->
[(1, 2), (2, 1)] >>= \(x,y) ->
return (f x *** g y)
)) [] [(+), subtract]
定義
moves =
foldr ((++) . (\f ->
foldr ((++) . (\g ->
foldr ((++) . (\(x,y) -> return (f x *** g y))
) [] [(1, 2), (2, 1)]
)) [] [(+), subtract]
)) [] [(+), subtract]
撤消返回:
moves =
foldr ((++) . (\f ->
foldr ((++) . (\g ->
foldr ((++) . (\(x,y) -> [f x *** g y])
) [] [(1, 2), (2, 1)]
)) [] [(+), subtract]
)) [] [(+), subtract]
所以你看到它在兩個元素列表上的嵌套。 展開摺疊留給讀者練習:)
這段代碼等同於'moves = [f x *** g y | (x,y)< - [(+),減去],g < - [(+),減去],' – 2014-10-30 17:39:58
在列表monad中, [x] =返回x'。 – chaosmasttter 2014-10-30 18:38:12