小编Sna*_*ake的帖子

Haskell声明空列表,但实际上不是空的?

我是Haskell的新手并且正在玩一下.我用守卫创建了一个递归函数.见下面的功能:

filterAge :: [Person] -> [String]
filterAge (x:xs)
 | (x:xs) == []                        = []
 | (getAge x) < 30 || (getAge x) > 40  = [] ++ filterAge xs
 | otherwise                           = [getName x] ++ filterAge xs
Run Code Online (Sandbox Code Playgroud)

我有一个用10人创建的数据集,我在这个方法中使用.当我尝试这个功能时,它给了所有合适的人,但之后它得到了一个非详尽的模式错误: ["Lise","Jaap","Elle","Ebba"*** Exception: D:\...:(44,1)-(47,77): Non-exhaustive patterns in function filterAge

我发现它永远不会到达第一个后卫.所以我玩了一下,发现了一些非常奇怪的东西(在我看来):

*Main> let (x:xs) = []
*Main> (x:xs) == []
False
Run Code Online (Sandbox Code Playgroud)

现在我的主要问题是:为什么(x:xs) == []返回False?

如果有人有更好的方法让我做一个很棒的功能,但这不是很重要.

提前致谢!

编辑

感谢Willem Van Onsem和Lambda.xy.x我快速回答了我的问题.这导致以下功能完美运行:

filterAge :: [Person] -> [String]
filterAge []                           = []
filterAge (x:xs)
 | …
Run Code Online (Sandbox Code Playgroud)

haskell list filter pattern-matching lazy-evaluation

4
推荐指数
1
解决办法
1845
查看次数