簡體   English   中英

關於haskell中“類型”和“數據”的困惑

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

使用構造函數FalseTrue定義Bool類型。 一個更復雜的例子是

data Maybe a = Nothing | Just a

它定義了帶構造函數的Maybe a polymorphic類型Nothing :: Maybe aJust :: a -> Maybe a 我已經包含了這些構造函數的類型,以突出它們作為普通值和函數存在。 函數和構造函數之間的區別在於,您可以在函數中執行任何操作,但只允許構造函數獲取現有值並生成另一種類型的值,而不對其執行任何轉換。 構造函數只是值的包裝。

暫無
暫無

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

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