gpt4 book ai didi

haskell - 作业 : Comparing intermediate expressions with == in Haskell

转载 作者:行者123 更新时间:2023-12-01 10:06:07 25 4
gpt4 key购买 nike

我写了下面的代码来测试一个列表是否是回文。令我惊讶的是,它没有编译错误“由于使用 == ... 而没有出现 (Eq a) 的实例”。我的假设是编译器不知道 leftHalfrightHalf 是列表。

    isPalindrome :: [a] -> Bool
isPalindrome [] = False
isPalindrome xs = if (leftHalf == reverse rightHalf)
then True
else False
where leftHalf = take center xs
rightHalf = drop center xs
center = if even (length xs)
then (length xs) `div` 2
else ((length xs) - 1) `div` 2

1) 如何告诉编译器 leftHalfrightHalf 是列表?
2) 我将如何使用模式匹配或其他 haskell 语言功能来解决这个问题?

编辑:谢谢大家的意见。特别提到 Matt Fenwick 的文档链接和 Duri 的优雅提示。我会在下面写下最终的解决方案以防万一

     isPalindrome' :: (Eq a) => [a] -> Bool
isPalindrome' [] = False
isPalindrome' xs = if p then True else False
where p = leftHalf == rightHalf
leftHalf = take c xs
rightHalf = take c (reverse xs)
c = div l 2
l = length xs

isPalindrome' 可以像 Demi 指出的那样改进

      isPalindrome'' :: (Eq a) => [a] -> Bool
isPalindrome'' [] = False
isPalindrome'' xs = if (reverse xs) == xs then True else False

最佳答案

为了测试两个列表是否相等,必须能够测试列表中的项目是否相等。因此,您的 [a] 类型列表必须确保 aEq 的实例。

此外,作为风格问题:

x = if c then True else False

可以替换为

x = c

关于haskell - 作业 : Comparing intermediate expressions with == in Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10433768/

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