gpt4 book ai didi

haskell - Haskell 中的 isPalindrome 函数给出错误

转载 作者:行者123 更新时间:2023-12-02 14:59:27 25 4
gpt4 key购买 nike

我试图编写一个程序来检查列表是否是回文并返回 Bool。

isPalindrome :: [a] -> Bool
isPalindrome [] = True
isPalindrome [x] = True
isPalindrome xs | (head xs) == (last xs) = isPalindrome (init(tail xs))
| otherwise = False

我收到了这样的错误消息:

problem6.hs:4:19: error:
* No instance for (Eq a) arising from a use of `=='
Possible fix:
add (Eq a) to the context of
the type signature for:
isPalindrome :: forall a. [a] -> Bool
* In the expression: (head xs) == (last xs)
In a stmt of a pattern guard for
an equation for `isPalindrome':
(head xs) == (last xs)
In an equation for `isPalindrome':
isPalindrome xs
| (head xs) == (last xs) = isPalindrome (init (tail xs))
| otherwise = False
|
4 | isPalindrome xs | (head xs) == (last xs) = isPalindrome (init(tail xs))
| ^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.

因为我经验不足,所以我从错误消息中看不明白。所以我不知道我的代码中的错误在哪里。感谢您的帮助。

最佳答案

问题是您需要约束多态类型a。现在,编译器没有关于类型的信息,因此它甚至不知道 (==) 是否为 a 定义(这是 没有因使用 ``==' 而产生的 (Eq a) 实例。它试图推断 aEq 实例,但它无法做到。您需要帮助它)。

您应该输入以下类型:

isPalindrome :: (Eq a) => [a] -> Bool

现在你告诉它 isPalindrome 只能被给予作为 Eq 实例的事物列表。

它指出了这一点,因为您正在尝试比较两个 a 的相等性:

(head xs) == (last xs)

关于错误消息的一些信息:

 Possible fix:
add (Eq a) to the context of
the type signature for:
isPalindrome :: forall a. [a] -> Bool

我的建议中 => 之前的内容称为上下文,您可以在其中向类型添加约束。这里的建议是告诉你完全按照我上面所说的去做(尽管以更冗长的方式)。

关于haskell - Haskell 中的 isPalindrome 函数给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58260444/

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