我需要为自然数的表示建立自己的数据类型。数据类型(预置)定义如下。此外,我需要创建函数,以便在本机数据类型Int和给定的数据类型之间进行转换。我设法从Int转换到给定的数据类型,并检查我的ZZ数据类型是否为Zero。虽然我真的想不出一种方法来将任何东西转换成零回到Int。我希望你们能给我一个如何做这件事的提示。
data IN_1 = One | Follower IN_1 deriving Show
data ZZ = Zero | Plus IN_1 | Minus IN_1 deriving Show
type Zed = Int
from_Zed_to_ZZ :: Zed-> ZZ
from_Zed_to_ZZ x
| x == 0 = Zero
| x > 0 = Plus (helper(x))
| x < 0 = Minus (helper(abs(x)))
helper :: Zed -> IN_1
helper x
| x==1 = One
| otherwise = Follower (helper(x-1))
instance Eq ZZ where
(==) Zero Zero = True
from_ZZ_to_Zed :: ZZ -> Zed
from_ZZ_to_Zed x |x == Zero = 0这些是我当前的测试用例:测试案例
发布于 2019-10-24 17:03:52
用代数数据类型包装的“解包”值的方法是模式匹配。每个函数参数不仅是一个标识符,而且实际上是一个模式。模式可能只是一个标识符,但也可以是其他东西。特别是,可以将模式指定为数据构造函数名(例如Plus),然后是一个或多个其他模式,该构造函数的每个参数都有一个模式。
就你而言:
from_ZZ_to_Zed :: ZZ -> Zed
from_ZZ_to_Zed Zero = 0
from_ZZ_to_Zed (Plus x) = ...
from_ZZ_to_Zed (Minus x) = ...然后,要从IN_1转换为Zed,使用类似于实现helper的递归。
unhelper :: IN_1 -> Zed
unhelper One = 1
unhelper (Follower x) = unhelper x + 1并将其用于Plus和Minus案例:
from_ZZ_to_Zed (Plus x) = unhelper x
from_ZZ_to_Zed (Minus x) = - (unhelper x)https://stackoverflow.com/questions/58545603
复制相似问题