Haskell:99个问题#1:第一个解决方案不能在GHCi中运行

Muh*_*uhd 2 haskell

第一个问题是编写一个函数来获取列表中的最后一个元素.

解决方案部分提供的第一个解决方案是:

myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
Run Code Online (Sandbox Code Playgroud)

所以在GHCi我做了:

Prelude> let myLast [a] = a
Prelude> let myLast (_:xs) = myLast xs
Prelude> myLast [1,2,3]
Run Code Online (Sandbox Code Playgroud)

这给了我一个例外:

*** Exception: <interactive>:12:5-29: Non-exhaustive patterns in function myLast
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

Tho*_*son 5

它不起作用,因为你let在GHCi中的使用是错误的.

let myLast [a] = a
Run Code Online (Sandbox Code Playgroud)

这定义了一个myLast仅对一个元素的列表进行操作的函数.

let myLast (_:xs) = mylast xs
Run Code Online (Sandbox Code Playgroud)

这定义了一个新函数,myLast从上面的行中过度隐藏旧的和不相关的函数.此新函数会为任何输入抛出异常(或无法终止).

你应该输入:

:{
let myLast [x] = x
    myLast (_:xs) = myLast xs
:}
Run Code Online (Sandbox Code Playgroud)

或者只是在文件而不是repl中输入您的代码.我强烈建议你避免使用除了单行或交互式实验之外的任何内容.