簡體   English   中英

定義新的Haskell類型

[英]Defining a new haskell type

我是Haskell的新手。 我有兩個問題,但它們有些相關。

是否可以定義一種類型的整數,但不包括特定的整數(例如零)。 或者只是正數。

data allIntsButZero = ..? { a /= 0 | for all a in Int} ??
data positiveInts   = ..? { a >= 0 | for all a in Int} ??

簡而言之,我可以將一種類型定義為另一種類型的子集嗎?

其次,我可以定義施加邏輯的類型嗎? 例如

type doublePair = (Int, Int * 2) {- where snd is always 2 times of fst -}
data validDDMMYYYY = G Int Int Int {- where complies to gregorian calendar -}

這些type doublePair確實沒有任何意義。 如果snd始終是fst兩倍,那么它實際上不包含任何信息! 因此,這種類型肯定更好地表示為

newtype DoubleableInt = DoubleableInt {getDoubleableInt :: Int}

其他的也確實有道理,但是我認為您仍然缺少抽象的意義 類型validDDMMYYYY可能應該表示一個日期 ,即一個時間點。 它是如何respresents這個真的不應該是用戶的擔憂:如果一個庫依賴於一定的代表性,它應該簡單地應該提供專門的“智能構造函數”,以確保良好性。 喜歡

newtype AllIntsButZero = AllIntsButZero {getNonzeroInt :: Int}

mkNonzeroInt :: Int -> Maybe AllIntsButZero
mkNonzeroInt 0 = Nothing
mkNonzeroInt n = AllIntsButZero n

然后,您可以拒絕導出AllIntsButZero構造函數(這將允許用戶形成不正確的AllIntsButZero 0 ):

module RestrictedNumbers (AllIntsButZero, getNonzeroInt, mkNonzeroInt) where

這樣,用戶只會將AllIntsButZero視為“黑匣子”,並且可以與它們一起使用的函數可以保證產生格式正確的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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