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