自己的数据类型 - 它们与本机数据类型之间的转换
Own Data Types - Conversion between them and native ones
我需要创建自己的数据类型来表示自然数。
数据类型(预)定义如下。
此外,我需要创建函数以在本机数据类型 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
将 "unwrap" 值包装在代数数据类型中的方法是通过模式匹配。每个函数参数不仅仅是一个标识符,实际上是一个模式。模式可能只是一个标识符,但它也可以是其他东西。特别是,模式可以指定为数据构造函数名称(例如 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)
我需要创建自己的数据类型来表示自然数。 数据类型(预)定义如下。 此外,我需要创建函数以在本机数据类型 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
将 "unwrap" 值包装在代数数据类型中的方法是通过模式匹配。每个函数参数不仅仅是一个标识符,实际上是一个模式。模式可能只是一个标识符,但它也可以是其他东西。特别是,模式可以指定为数据构造函数名称(例如 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)