[英]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
“解包”包裹在代數數據類型中的值的方法是通過模式匹配。 每個 function 參數不僅僅是一個標識符,實際上是一個模式。 模式可能只是一個標識符,但也可以是其他東西。 特別是,可以將模式指定為數據構造函數名稱(例如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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.