我想制作一个显示列表最后一个元素的函数。
这是我的代码:

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

10-05 20:49