[英]Confusion about “type” and “data” in haskell
data MoneyAmount = Amount Float Currency
deriving (Show, Eq)
data Currency = EUR | GBP | USD | CHF
deriving (Show, Eq)
type Account = (Integer, MoneyAmount)
putAmount :: MoneyAmount -> Account -> Account
putAmount mon acc = undefined
我需要編寫一個為賬戶增加資金的功能(如果增加的錢是賬戶中的錯誤貨幣,則顯示錯誤)。
我知道如何創建金額
let moni = Amount 6.6 EUR
但我不知道寫什么來創建一個帳戶? (我希望句子有意義)我不知道如何操縱輸入來做整個添加帳戶的事情。
我嘗試過類似的東西
let acc = Account 1 moni
我的問題是如何操縱帳戶,以便我可以編寫該功能。
type
創建一個類型同義詞 ; 一個Account
與(Integer, MoneyAmount)
,並且您以相同的方式編寫它:
let acc = (1, moni)
type
只是一個別名。 它不定義新類型,而是定義現有類型的新名稱。 所以你可以做到
type Money = Float
你可以使用Money
,你可以使用Float
,反之亦然。 如果你有
foo :: Float -> Float
foo x = 2 * x
然后
> foo (1 :: Float)
2
> foo (1 :: Money)
2
兩者都很好。 在您的情況下, Account
只是(Integer, MoneyAmount)
的別名,因此您可以像構建任何其他元組一樣構造一個。
data
定義了一個全新的類型,這需要新的構造函數。 例如:
data Bool = False | True
使用構造函數False
和True
定義Bool
類型。 一個更復雜的例子是
data Maybe a = Nothing | Just a
它定義了帶構造函數的Maybe a
polymorphic類型Nothing :: Maybe a
和Just :: a -> Maybe a
。 我已經包含了這些構造函數的類型,以突出它們作為普通值和函數存在。 函數和構造函數之間的區別在於,您可以在函數中執行任何操作,但只允許構造函數獲取現有值並生成另一種類型的值,而不對其執行任何轉換。 構造函數只是值的包裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.