如果在每一行使用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