GHCi中的缩进错误,实现过滤器

Dus*_*etz 3 haskell

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)

:{:}命令用于输入一个定义跨越多行.对齐=是可选的,它是重要的线条的缩进.