haskell - 自己的数据类型 - 它们与 native 数据类型之间的转换

标签 haskell instance typeclass custom-type

我需要创建自己的数据类型来表示自然数。 数据类型(预)定义如下。 此外,我需要创建函数来在 native 数据类型 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

最佳答案

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

关于haskell - 自己的数据类型 - 它们与 native 数据类型之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58545603/

相关文章:

haskell - 将函数应用于矩阵的每个元素

haskell - 在函数签名中隐藏多参数类型类的类型参数之一

java - 每个实例记录器,不好的做法?

haskell - 将返回类型限制为 Context

Haskell - 具有两个参数的类型类的翻转参数

api - Haskell REST/GDATA API 库

javascript - javascript中的内存问题

excel - VBA从模块更改实例变量(excel)

haskell : Illegal type synonym family application in instance

haskell - 如何指定类型类的具体实现?