2012-06-06 32 views
0

我有這些語句:讓數據構造

data SL a = SR (Integer -> (a, Integer)) 
    deriving(Show) 

instance Monad SL where 
    return k = SR (\st -> (k, st)) 

xx::SL Integer 
xx = return 4 

然後我做的:

let SR f = xx 

現在我有:

xx :: SL Integer 
f :: Integer -> (Integer, Integer) 

,但我不明白爲什麼。也許我錯過了let DATACONSTRUCTOR ..的句法含義。

你能幫忙嗎?

+3

你期望什麼? –

回答

8

let SR f = xx表示SR f應該等於xx。所以,

SR f = xx     -- let 
    = return 4    -- def. xx 
    = SR (\st -> (4, st)) -- def. return 

因此

f = \st -> (4, st) -- remove SR on both sides 

,其在這種情況下,是類型Integer -> (Integer, Integer)由於SR :: a -> Integer -> (a, Integer)xx :: SL Integer的。

5

letwhere也是模式匹配,如case,但只有一個替代方案。因此,例如一個let表達:

let SR f = xx in ... 

就像下面case表達:

case xx of 
    SR f -> ... 

大多數人只使用letwhere做簡單的變量綁定,所以他們沒有意識到,他們是模式匹配。然而,變量綁定只是模式匹配的特例(模式匹配中的標識符匹配所有內容並將該值綁定到變量)。

此外,大多數模式匹配需要多個替代方案,因此let不適用。即使你只想匹配一個特定的構造函數,做一個不完整的模式匹配也不是一個好主意。但是,在某些情況下,當一個替代方法是完全匹配時,例如,元組匹配(x, y),或者,在您的情況下,只有一個構造函數的數據類型。