我想制作一个显示列表最后一个元素的函数。
这是我的代码:
ghci> let myLast :: [a] -> a
ghci> let myLast [] = error
ghci> let myLast [x] = x
ghci> let myLast (x:xs) = myLast xs
我得到以下错误:
***Exception: Non-exhaustive patterns in function myLast
我了解到您丢失案件时会遇到此错误,但我想我已经涵盖了所有可能性。有任何想法吗?
最佳答案
如果在每一行中使用let
,则每个定义都将创建一个名为myLast
的新函数,以覆盖所有先前的定义。因此,最终得到的结果等同于
GHCi>让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 MyLast.hs
将该文件加载到GHCi中。仅当您已经在GHCi中(或在诸如
let
之类的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
但是,我宁愿写成
twiceLast = (2*) . myLast
where myLast [] = error
myLast [x] = x
myLast (x:xs) = myLast xs