如何解决当模式匹配函数列表
考虑以下代码:
step :: [[a] -> [a]] -> [[a]] -> [[a]]
step (f:fs) xss
| (fs == []) = yss
| otherwise = step fs yss
where yss = map f xss
它抛出以下错误:
No instance for (Eq ([a] -> [a])) arising from a use of ‘==’
(maybe you haven't applied a function to enough arguments?)
|
3 | | (fs == []) = res
| ^^^^^^^^
fs
应该是一个函数列表或者一个空列表,那么为什么编译器试图用它来生成一个函数?
解决方法
只有在可以检查元素是否相等时(Eq
的实例),您才能检查列表是否相等。您可能认为这是无稽之谈,因为您正在与空列表进行比较,因此元素的值并不重要。但是在类型上,Haskell 将所有这些列表都看作只是列表,并且不知道它是否为空,因此它不能让比较发生。
幸运的是,有一个函数:null :: [a] -> Bool
,用于检查列表是否为空:
step :: [[a] -> [a]] -> [[a]] -> [[a]]
step (f:fs) xss
| null fs = yss
| otherwise = step fs yss
where yss = map f xss
(免责声明:null
实际上是为所有可折叠对象定义的,但出于我们的目的,您可以将其视为列表函数)
您还可以使用 pattern guard 进行模式匹配(因为模式匹配可以识别空列表):
step :: [[a] -> [a]] -> [[a]] -> [[a]]
step (f:fs) xss
| [] <- fs = yss
| otherwise = step fs yss
where yss = map f xss
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。