簡體   English   中英

自己的數據類型 - 它們與本機數據類型之間的轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM