自身数据类型-它们与本机类型之间的转换

问题描述 投票:0回答:1

我需要创建自己的数据类型来表示自然数。数据类型如下定义(预定义)。此外,我需要创建函数以在本机数据类型Int与给定的数据之间进行转换。我设法将Int转换为给定的整数,并检查我的ZZ数据类型是否为零。虽然我真的想不出一种方法,但是将零以外的任何内容转换回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

这些是我当前的测试用例:testcases

haskell instance typeclass custom-type
1个回答
2
投票

“解包”代数数据类型中的值的方法是通过模式匹配。每个函数参数不仅是标识符,而且实际上是pattern。模式可能只是一个标识符,但也可能是其他东西。特别是,可以将一个模式指定为数据构造器名称(例如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

并将其用于PlusMinus情况:

from_ZZ_to_Zed (Plus x) = unhelper x
from_ZZ_to_Zed (Minus x) = - (unhelper x)
© www.soinside.com 2019 - 2024. All rights reserved.