Если вы используете 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
.
Ключевое слово let
только необходима, когда вы уже в GHCi (или, в некоторых монады как IO
, или в другой функции) и хотите сделать локальное определение. Но тогда вы должны использовать только 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