关于haskell中“类型”和“数据”的困惑

时间:2015-03-24 20:47:18

标签: haskell types

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

我的问题是如何操纵帐户,以便我可以编写该功能。

2 个答案:

答案 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

使用构造函数BoolFalse定义True类型。一个更复杂的例子是

data Maybe a = Nothing | Just a

使用构造函数Maybe aNothing :: Maybe a定义Just :: a -> Maybe a多态类型。我已经包含了这些构造函数的类型,以突出它们作为普通值和函数存在。函数和构造函数之间的区别在于,您可以在函数中执行任何操作,但只允许构造函数获取现有值并生成另一种类型的值,而不对其执行任何转换。构造函数只是值的包装。