如果在每一行使用let
,每個定義將命名爲myLast
一個新功能,陰影之前的所有定義。所以你最終相當於
GHCi> let myLast (x:xs) = myLast xs
孤單。
你可能想是什麼力量讓一個Haskell文件,說MyLast.hs
,含
module MyLast where
myLast :: [a] -> a
myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs
可以然後將該文件加載到GHCI與ghci MyLast.hs
。
的關鍵字時,你已經在GHCI(或者,在一些單子像IO
,或在其他功能),並希望做出局部定義只需要let
。但是,您只能使用let
一次,例如
GHCi> let myLast :: [a]->a; myLast [] = error; myLast [x] = x; myLast (x:xs) = myLast xs
或
twiceLast :: [Int] -> [Int]
twiceLast = let myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs
in \xs -> 2 * last xs
我會,但是,喜歡寫爲
twiceLast = (2*) . myLast
where myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs