GHCi中的非穷举模式

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)

我收到以下错误:

***Exception: Non-exhaustive patterns in function myLast
Run Code Online (Sandbox Code Playgroud)

我知道你在错过案件时会收到这个错误,但我认为我已经包含了所有可能性.有任何想法吗?

lef*_*out 5

如果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)