第一个问题是编写一个函数来获取列表中的最后一个元素.
解决方案部分提供的第一个解决方案是:
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)
为什么这不起作用?
它不起作用,因为你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中输入您的代码.我强烈建议你避免使用除了单行或交互式实验之外的任何内容.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |