2013-12-11 82 views
2

什麼是類型和表達式的值:我測試了它,並發現它只是打印拉姆達3次這是什麼功能產生

do [1,2,3]; "lambda" 

。 但我不明白它爲什麼這樣做。 我如何使用綁定來重寫它。感覺有必要重寫它。

+1

這是功課嗎? – augustss

+0

不,這是一箇舊的考試問題。 所以我認爲可以在這裏尋求幫助。 – user2975699

回答

6

你的代碼是一樣的

[1, 2, 3] >> "lambda" 

>>被定義爲

m >> n = m >>= \_ -> n 

而且>>=運營商名單定義爲:

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

所以,你的代碼可能翻譯成:

concat $ map (const "lambda") [1, 2, 3] 

其產生結果

"lambdalambdalambda" 
0

這裏是相同的輸出使用綁定:

λ> [1,2,3] >>= \x -> "lambda" 
"lambdalambdalambda" 

那你希望得到?

+0

我沒有想到它會起作用,因爲我們沒有回報。 什麼是λ> [1,2,3] >> = \ x - >「lambda」 我們將一個列表綁定到一個產生「lambda」結果的函數。 它怎麼應用了三次。 – user2975699

+0

什麼是λ>? 爲什麼功能應用了三次? – user2975699

+0

這沒什麼重要的。我在YouTube教程中看到它並喜歡它。在ghci裏面,你可以通過運行':set prompt '來改變提示設置。要讓ghci在每次開始新會話時設置它,您可以將其添加到您主目錄中的.ghci文件 – 2013-12-11 16:31:44

0

通過列表單子的定義,

do [1,2,3]; "lambda"  -- "lambda" = ['l','a','m','b','d','a'] 
    = [1,2,3] >>= (\x -> "lambda") 
    = [r | x <- [1,2,3], r <- "lambda"] 

爲列表單子return x = [x],和

do x <- [1,2,3]; return x 
    = [r | x <- [1,2,3], r <- [x]] 

因此通常的用例獲得快捷方式只需[x | x <- [1,2,3]]。這使用單子法m >>= return = m

但是,do序列中的最後一個值的類型爲m a(這裏是[a])不必是單例列表。它可以是空的,或者擁有多個元素。

至於結果的類型,它是[Char]。首先,do代表綁定鏈,綁定的類型是

(>>=) :: m a -> (a -> m b) -> m b 

因爲在你的榜樣的單子值的列表,我們認爲m = []。最後一個值是String,它是[Char],所以根據上面的簽名,這是結果的類型。