Haskell检查自定义数据类型是否为偶数

Haskell检查自定义数据类型是否为偶数,haskell,types,Haskell,Types,因此,我有以下数据类型的练习 data Nat = Zero | Succ Nat deriving (Eq,Ord,Show,Read) 这可以用来表示一个自然数,例如2=Succ(Succ零)。 我实现了一个检查数字是否为偶数的函数 even :: Nat -> Bool even x = count x `mod` 2 == 0 count :: Nat -> Int count Zero = 0 count (Succ x) = 1 + count x 它适用于零,但每

因此,我有以下数据类型的练习

data Nat = Zero | Succ Nat deriving (Eq,Ord,Show,Read)
这可以用来表示一个自然数,例如2=Succ(Succ零)。 我实现了一个检查数字是否为偶数的函数

even :: Nat -> Bool
even x = count x `mod` 2 == 0

count :: Nat -> Int
count Zero = 0
count (Succ x) = 1 + count x
它适用于零,但每当我尝试其他操作时,例如count such Zero或count such(such Zero)

*Main>偶数成功零
:6:1:错误:
*无法将预期类型'Nat->t'与实际类型'Bool'匹配
*函数“evenN”应用于两个参数,
但是它的'Nat->Bool'类型只有一个
在表达式中:evenN such Zero
在‘it’的方程式中:it=evenN-such-Zero
*相关的绑定包括it::t(绑定在:6:1)
:6:7:错误:
*无法将预期类型“Nat”与实际类型“Nat->Nat”匹配
*可能原因:`成功'应用于的参数太少
在'evenN'的第一个参数中,即'Succ'
在表达式中:evenN such Zero
在‘it’的方程式中:it=evenN-such-Zero
问题不在于函数本身,而在于调用函数的方式:

 even Succ  Zero
或者更详细:

(even Succ) Zero
因此,您在这里调用
偶数
,并将
Succ
作为参数,
Succ
Nat->Nat
类型的函数,而不是
Nat
本身。为了将
succzero
传递到偶数,需要使用括号,如:

even (Succ Zero)
也就是说,不需要首先将Peano数转换为
Int
来检查它是否为偶数。可以归纳地定义此类功能,如:

  • 为偶数
  • (成功归零)
    不均匀;及
  • (such(such x))
    为偶数,当且仅当
    x
    为偶数
  • 因此,我们可以这样实施:

    even' :: Nat -> Bool
    even' Zero = True
    even' (Succ Zero) = False
    even' (Succ (Succ x)) = even' x
    
    或者我们可以引入一个“helper”函数
    odd'::Nat->Bool
    ,并使用相互递归:

    even' :: Nat -> Bool
    even' Zero = True
    even' (Succ x) = odd' x
    
    odd' :: Nat -> Bool
    odd' Zero = False
    odd' (Succ x) = even' x
    
    问题不在于函数本身,而是调用函数,如:

     even Succ  Zero
    
    或者更详细:

    (even Succ) Zero
    
    因此,您在这里调用
    偶数
    ,并将
    Succ
    作为参数,
    Succ
    Nat->Nat
    类型的函数,而不是
    Nat
    本身。为了将
    succzero
    传递到偶数,需要使用括号,如:

    even (Succ Zero)
    
    也就是说,不需要首先将Peano数转换为
    Int
    来检查它是否为偶数。可以归纳地定义此类功能,如:

  • 为偶数
  • (成功归零)
    不均匀;及
  • (such(such x))
    为偶数,当且仅当
    x
    为偶数
  • 因此,我们可以这样实施:

    even' :: Nat -> Bool
    even' Zero = True
    even' (Succ Zero) = False
    even' (Succ (Succ x)) = even' x
    
    或者我们可以引入一个“helper”函数
    odd'::Nat->Bool
    ,并使用相互递归:

    even' :: Nat -> Bool
    even' Zero = True
    even' (Succ x) = odd' x
    
    odd' :: Nat -> Bool
    odd' Zero = False
    odd' (Succ x) = even' x
    

    偶数(成功零)
    无需转换为
    Int
    。提示:编写相互递归的
    偶数
    奇数
    函数。如果
    Nat
    将成为一种数据类型,您需要坚持一段时间,那么我想您最好先编写
    枚举
    实例。
    偶数(成功零)
    无需转换为
    Int
    。提示:编写相互递归的
    偶数
    奇数
    函数。如果
    Nat
    将成为一种数据类型,您将坚持一段时间,那么我想您最好先编写一个
    枚举
    实例。