gpt4 book ai didi

haskell - 模式匹配函数列表时没有 (Eq ([a] -> [a])) 的实例

转载 作者:行者123 更新时间:2023-12-03 23:19:58 25 4
gpt4 key购买 nike

考虑以下代码:

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

关于haskell - 模式匹配函数列表时没有 (Eq ([a] -> [a])) 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65448278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com