gpt4 book ai didi

haskell - 与也许 |只是数据类型,不能构造无限类型

转载 作者:行者123 更新时间:2023-12-04 08:53:46 25 4
gpt4 key购买 nike

我有一个函数应该返回列表的倒数第二个元素。如果什么都不能返回,函数将返回 Nothing。

data Maybe a = Nothing | Just a
secondLast :: [a] -> Maybe a
secondLast [] = Nothing
secondLast [a, _] = a
secondLast (_:xs) = secondLast xs
但是在编译时我收到此错误
* Occurs check: cannot construct the infinite type: a ~ Maybe a
* In the expression: a
In an equation for `secondLast': secondLast [a, _] = a
* Relevant bindings include
a :: a (bound at <interactive>:92:13)
secondLast :: [a] -> Maybe a (bound at <interactive>:92:1)
我在这里做错了什么?

最佳答案

secondLast 的不同实现有不同的返回类型。这导致编译器尝试使这些类型等效,这是它无法做到的。secondLast []返回 Nothing ,其类型为 Maybe a . secondLast [a, b] ,另一方面,返回 a ,其类型为 a .因此,编译器试图找到一个与自身等价的类型,该类型包含在 Maybe 中。单子(monad)。
表达式 a ~ Maybe a表示“类型 a 等价于类型 Maybe a ,它没有解决方案(也就是无法构造类型),因此编译器会抛出错误。它是一个“无限类型”,因为它的等价性在于它本身。
要修复此错误,您应该将第二个实现更改为返回 Maybe a像第一个:

secondLast [a, _] = Just a
JustMaybe 的第二个构造函数, 所以 Just aNothing 具有相同的类型,即 Maybe a .这将允许类型解析。
您的代码也缺少 secondLast 的情况。接收一个元素的列表,因此您应该考虑在这种情况下应该发生什么。

关于haskell - 与也许 |只是数据类型,不能构造无限类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63952627/

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