gpt4 book ai didi

haskell - 初学者 Haskell 问题 - 无法将类型 ‘Bool’ 与 ‘[Char]’ 匹配

转载 作者:行者123 更新时间:2023-12-02 21:09:04 25 4
gpt4 key购买 nike

我需要在 Haskell 中使用递归来制作一个回文检查器来完成家庭作业。该函数应接收一个字符串并返回一个 Bool。尝试编译时,我收到错误,“无法将类型‘Bool’与‘[Char]’匹配。”

我对 Haskell 很陌生,所以我确信我只是忽略了一些愚蠢的事情,但我想无论如何我都会寻求一些帮助。我已在下面粘贴了我的代码以及我收到的完整错误。

isPalindrome :: String -> Bool
isPalindrome s
| isPalindrome ((null s) || (length s == 1)) = True
| isPalindrome ((s !! 0) /= (s !! (length s - 1))) = False
| otherwise = isPalindrome (tail (init s))

我的实现检查输入字符串是否为空或大小为 1,如果是则返回 true。如果不是,则检查第一个字符和最后一个字符是否不同,如果不同,则返回 false。否则,它会再次调用自身,传入第一个和最后一个字符被截断的字符串。

main.hs:15:19: error:
• Couldn't match type ‘Bool’ with ‘[Char]’
Expected type: String
Actual type: Bool
• In the first argument of ‘isPalindrome’, namely
‘((null s) || (length s == 1))’
In the expression: isPalindrome ((null s) || (length s == 1))
In a stmt of a pattern guard for
an equation for ‘isPalindrome’:
isPalindrome ((null s) || (length s == 1))
|
15 | | isPalindrome ((null s) || (length s == 1)) = True
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
main.hs:16:19: error:
• Couldn't match type ‘Bool’ with ‘[Char]’
Expected type: String
Actual type: Bool
• In the first argument of ‘isPalindrome’, namely
‘((s !! 0) /= (s !! (length s - 1)))’
In the expression: isPalindrome ((s !! 0) /= (s !! (length s - 1)))
In a stmt of a pattern guard for
an equation for ‘isPalindrome’:
isPalindrome ((s !! 0) /= (s !! (length s - 1)))
|
16 | | isPalindrome ((s !! 0) /= (s !! (length s - 1))) = False
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

最佳答案

f x 是对函数f 的函数调用,参数为x。但如果测试表达式 x 已经满足您的需要,则无需调用该函数:

isPalindrome :: String -> Bool
isPalindrome s
-- f x
| {- isPalindrome -} ((null s) || (length s == 1)) -- here
= True
| {- isPalindrome -} ((s !! 0) /= (s !! (length s - 1))) -- and here
= False
| otherwise = isPalindrome (tail (init s))

isPalindrome::String -> Bool 表示 isPalindrom 的第一个参数应为 String。但真正意味着存在的是一个 bool 值,用作守卫,以选择适当的行动方案。因此出现错误消息。我们已经有了 Bool

最后一行的函数调用是确实必须完成的递归调用。

{- ... -} 是 Haskell 中的多行注释。


通常、更惯用的 Haskell 方法是不显式执行这些测试,而是通过子句在函数定义中安排等效的模式匹配:

isPalindrome :: String -> Bool
isPalindrome [] = True -- (null s)
isPalindrome [_] = True -- (length s == 1)
isPalindrome -- [a, ..., b] | a /= b
(x:xs) | x /= last xs
= False -- ((s !! 0) /= (s !! (length s - 1)))
isPalindrome -- [a, ...xs, b]
(_:xs) = isPalindrome -- xs
(init xs)

上面的代码在注释中包含一些虚构的列表模式,以及代码本身中的 Haskell 等效项。

事实上,如@chepner在评论中指出,模式通常可以帮助避免效率低下:计算 lengthO(n) 而与 [_] 匹配的模式是O(1)

当然,这个特定的代码仍然非常低效,因为其他两个子句也执行 O(n) 操作(lastinit) 。存在 O(n) 算法。

关于haskell - 初学者 Haskell 问题 - 无法将类型 ‘Bool’ 与 ‘[Char]’ 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250294/

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