繁体   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