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
将成为一种数据类型,您将坚持一段时间,那么我想您最好先编写一个枚举
实例。