首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自己的数据类型-它们与本机数据类型之间的转换

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

Stack Overflow用户
提问于 2019-10-24 16:33:33
回答 1查看 53关注 0票数 2

我需要为自然数的表示建立自己的数据类型。数据类型(预置)定义如下。此外,我需要创建函数,以便在本机数据类型Int和给定的数据类型之间进行转换。我设法从Int转换到给定的数据类型,并检查我的ZZ数据类型是否为Zero。虽然我真的想不出一种方法来将任何东西转换成零回到Int。我希望你们能给我一个如何做这件事的提示。

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-24 17:03:52

用代数数据类型包装的“解包”值的方法是模式匹配。每个函数参数不仅是一个标识符,而且实际上是一个模式。模式可能只是一个标识符,但也可以是其他东西。特别是,可以将模式指定为数据构造函数名(例如Plus),然后是一个或多个其他模式,该构造函数的每个参数都有一个模式。

就你而言:

代码语言:javascript
复制
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的递归。

代码语言:javascript
复制
unhelper :: IN_1 -> Zed
unhelper One = 1
unhelper (Follower x) = unhelper x + 1

并将其用于PlusMinus案例:

代码语言:javascript
复制
from_ZZ_to_Zed (Plus x) = unhelper x
from_ZZ_to_Zed (Minus x) = - (unhelper x)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58545603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档