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
我的问题是如何操纵帐户,以便我可以编写该功能。
答案 0 :(得分:6)
type
创建类型同义词; Account
与(Integer, MoneyAmount)
完全相同,您可以用同样的方式编写它:
let acc = (1, moni)
答案 1 :(得分:3)
type
只是一个别名。它不定义新类型,而是定义现有类型的新名称。所以你可以做到
type Money = Float
您可以使用Money
使用Float
,反之亦然。如果你有
foo :: Float -> Float
foo x = 2 * x
然后
> foo (1 :: Float)
2
> foo (1 :: Money)
2
两者都很好。在您的情况下,Account
只是(Integer, MoneyAmount)
的别名,因此您可以像构建任何其他元组一样构造一个。{/ p>
data
定义了一个全新的类型,这需要新的构造函数。例如:
data Bool = False | True
使用构造函数Bool
和False
定义True
类型。一个更复杂的例子是
data Maybe a = Nothing | Just a
使用构造函数Maybe a
和Nothing :: Maybe a
定义Just :: a -> Maybe a
多态类型。我已经包含了这些构造函数的类型,以突出它们作为普通值和函数存在。函数和构造函数之间的区别在于,您可以在函数中执行任何操作,但只允许构造函数获取现有值并生成另一种类型的值,而不对其执行任何转换。构造函数只是值的包装。