2016-12-11 61 views
1

我正在準備我的關於Haskell的期末考試,而我會在單子,我們被賦予這樣一個例子:結果在Haskell與單子表情

給出下面的定義列表單子:

instance Monad [] where 
    m >>= f = concatMap f m 
    return x = [x] 

,其中各類(>>=)concatMap

(>>=) :: [a] -> (a -> [b]) -> [b] 
concatMap :: (a -> [b]) -> [a] -> [b] 

什麼是表達式的結果?

> [1,2,3] >>= \x -> [x..3] >>= \y -> return x 
    [1, 1, 1, 2, 2, 3] //Answer 

這裏的答案是什麼,我認爲這是,現在我們簡要地走過去單子不同,但是從我的理解(>>=)被稱爲綁定,並且可以在上面的表達式爲「applyMaybe」讀。在這種情況下,對於綁定的第一部分,我們得到[1,2,3,2,3,3],我們繼續綁定的第二部分,但定義return x以返回x的列表。這應該是[1,2,3,2,3,3]。但是,我可能誤解了這個表達。任何人都可以解釋我的方法做錯了嗎?我應該如何解決這個問題。謝謝。

+2

您應該首先展開'>> ='和'return',將它們替換爲它們的定義。 – melpomene

+0

「根據我的理解(>> =)被稱爲綁定,並且可以在上面的表達式中讀作applyMaybe」 - 名稱「applyMaybe」只會在「Maybe」monad中有意義。 – duplode

回答

2

這種情況下綁定的第一部分,我們得到[1,2,3,2,3,3]

正確的。

我們繼續第二部分的綁定,但是「return x」被定義爲返回x的列表。應該是[1,2,3,2,3,3]。

注意,在...

[1,2,3] >>= \x -> [x..3] >>= \y -> return x 

... x通過(的拉姆達)第一(>>=),和未結合由第二個。一些額外的括號可能會做出更加清晰:

[1,2,3] >>= (\x -> [x..3] >>= (\y -> return x)) 

\y -> return x,值勢必y(也就是[1,2,3,2,3,3]元素)將被忽略,並綁定到x(也就是元素的相應值取代的每個y生成的原始列表)。示意圖上,我們有:

[1,  2, 3] -- [1,2,3] 
[1,2,3, 2,3, 3] -- [1,2,3] >>= \x -> [x..3] 
[1,1,1, 2,2, 3] -- [1,2,3] >>= \x -> [x..3] >>= \y -> return x 
+0

這是一個很好的圖表 – luqui

+0

感謝您的詳細解釋,幫助我更好地理解它。 –

1

首先,讓我們清楚這種表達是如何解析:lambda表達式的語法使者,即他們抓住儘可能多的,因爲他們可以給他們的權利,將其作爲函數的結果。所以你在那裏解析爲

[1,2,3] >>= (\x -> ([x..3] >>= \y -> return x)) 

內部表達式實際上寫得比它應該更復雜。根本不使用ya >>= \_ -> p只能寫成a >> p。還有一個更好的替代,但:一般情況下,一元綁定a >>= \q -> return (f q)相當於fmap f a,使你的表達應該被寫入

[1,2,3] >>= (\x -> (fmap (const x) [x..3])) 

[1,2,3] >>= \x -> map (const x) [x..3] 

[1,2,3] >>= \x -> replicate (3-x+1) x 

在這指出它應該很清楚結果是什麼,因爲列表單元中的>>=只是映射到每個元素和c結果結果。

+0

我明白你的意思了,但我的教授最初打算這樣做。但是,如果她像你所說的那樣,可能會有所幫助。謝謝。 –