Dia*_*ana 2 haskell function multiline ghci read-eval-print-loop
我想创建一个显示列表最后一个元素的函数.这是我的代码:
ghci> let myLast :: [a] -> a
ghci> let myLast [] = error
ghci> let myLast [x] = x
ghci> let myLast (x:xs) = myLast xs
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Run Code Online (Sandbox Code Playgroud)***Exception: Non-exhaustive patterns in function myLast
我知道你在错过案件时会收到这个错误,但我认为我已经包含了所有可能性.有任何想法吗?
如果let在每一行中使用a ,则每个定义将生成一个名为的新函数myLast,该函数将隐藏所有先前的定义.所以你最终得到的相当于
GHCi>让myLast(x:xs)= myLast xs
单独.
你可能想要的是制作一个MyLast.hs包含的haskell文件
module MyLast where
myLast :: [a] -> a
myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs
Run Code Online (Sandbox Code Playgroud)
然后你可以将该文件加载到GHCi中ghci MyLast.hs.
let只有当你已经在GHCi中(或者在某些monad中IO,或者在另一个函数中)并且想要进行本地定义时,才需要该关键字.但是你必须只使用let一次,例如
GHCi>让myLast :: [a] - > a; myLast [] =错误; 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
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿写作
twiceLast = (2*) . myLast
where myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs
Run Code Online (Sandbox Code Playgroud)