Prelude> let filter' p (x:xs) | p x = x : filter' p xs | otherwise = filter' p xs
Prelude> let filter' _ [] = []
Prelude> filter' odd [1..10]
*** Exception: <interactive>:1:5-21: Non-exhaustive patterns in function filter'
Run Code Online (Sandbox Code Playgroud)
我错过了什么模式?
Prelude> :{
Prelude| let filter' p (x:xs)
Prelude| | p x = x : filter' p xs
Prelude| | otherwise = filter' p xs
Prelude| let filter' _ [] = []
Prelude| :}
<interactive>:2:5: parse error (possibly incorrect indentation)
Run Code Online (Sandbox Code Playgroud)
在ghci中定义这个(语法明智)的惯用方法是什么?排队的是什么=- 我不知道在定义它们之前有多少空格留给下面的条款!什么是:{}:,有更好的方法吗?
ham*_*mar 10
这里有两个问题.首先,使用多个let语句会产生两个单独的定义,后者会影响前者.其次,语法错误的原因是你没有足够地缩进你的警卫(该| px ...行应该进一步缩进filter' p (x:xs)).
虽然将定义保存在文件中更简单,但这是您在GHCi中正确输入的方法.
Prelude> :{
Prelude| let filter' p (x:xs)
Prelude| | p x = x : filter' p xs
Prelude| | otherwise = filter' p xs
Prelude| filter' _ [] = []
Prelude| :}
Run Code Online (Sandbox Code Playgroud)
的:{和:}命令用于输入一个定义跨越多行.对齐=是可选的,它是重要的线条的缩进.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |