在函数内部使用Haskell函数

3

我希望你能帮我翻译一下Haskell练习中的一点提示。

首先,我需要实现一个程序,用于检查一个整数是否为偶数...目前我的代码可以完美地实现这个功能。

isEven :: Int -> Bool
isEven 0 = True
isEven (-1) = False
isEven 1 = False
isEven x
        |x<0 = isEven (x+2)
        |x>0 = isEven (x-2)

接下来我需要使用这个函数来计算列表中所有偶数整数的数量。 到目前为止,我的代码:

countEven :: [Int] -> Int
countEven (x:xs) = (isEven x)
                           |True = 1 + countEven xs
                           |False = 0 + countEven xs

我想使用isEven-returncode(True|False)来确定是否计数我的Int。我不知道如何继续编写此脚本。
在这种情况下,它说:
“parse error on input '|'”
我尝试了另一个脚本,但是它给出了错误:
“Couldn't match expected type 'Int' with actual type 'Bool'。”
因此,函数isEven正在工作,但我不知道如何将“True”语句转换为我的if语句。

如果你将负数的情况改为 | x<0 = isEven (-x),那么就不需要 isEven (-1) = False - Landei
1个回答

5

以下任何一项都可以:

countEven (x:xs) = if isEven x then 1 + countEven xs else 0 + countEven xs
countEven (x:xs) = (if isEven x then 1 else 0) + countEven xs
countEven (x:xs) = case isEven x of
    True -> 1 + countEven xs
    False -> 0 + countEven xs
countEven (x:xs)
   | isEven x  = 1 + countEven xs
   | otherwise = 0 + countEven xs

编译没有任何错误,但在尝试计算 [2,4,5,6] 中的偶数时仍然给出以下错误: countEven 函数中的非穷尽模式 这是什么意思? - Side2005
4
好的,我自己找到了错误 :) 添加 countEven [] = 0 就解决了问题。 - Side2005
1
@Side2005 如果这个答案对您有用,请接受它吧(点击投票箭头下面的勾号)。 - Lambda Fairy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接