2015-03-24 3 views
3
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 

Мне нужно написать функцию, которая добавляет деньги в учетную запись (ошибка отображения, если деньги добавлены, неверная валюта на счете).Путаница о «типе» и «данных» в haskell

Я знаю, как создать Сумму

let moni = Amount 6.6 EUR 

, но я понятия не имею, что написать, чтобы создать учетную запись? (я надеюсь, что это предложение имеет смысл) Я не знаю, как манипулировать вводом, чтобы сделать все, что нужно добавить в аккаунт.

Я пытался что-то вроде

let acc = Account 1 moni 

Мой вопрос больше, как манипулировать счет, так что я могу написать функцию.

ответ

6

type создает a тип синоним; Account точно такой же, как (Integer, MoneyAmount), и вы пишете это так же:

let acc = (1, moni) 
+0

aw сладкий, спасибо. Как я буду использовать acc в функции? Я предполагаю, что просто делать acc + money (let money = Amount 5 EUR) не получится. – srysry

+0

Не совсем, но вы можете сделать 'let (accountNo, amount) = acc' или вообще не писать' acc' и написать 'putAmount mon (accountNo, amount)' или что-то еще. –

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), поэтому вы можете построить его так же, как и любой другой кортеж.

A data определяет совершенно новый тип, и для этого требуются новые конструкторы. Например:

data Bool = False | True 

определяет тип Bool с конструкторами False и True. Более сложный пример будет

data Maybe a = Nothing | Just a 

, который определяет Maybe a полиморфного типа с конструкторами Nothing :: Maybe a и Just :: a -> Maybe a. Я включил типы этих конструкторов, чтобы подчеркнуть, что они существуют как обычные значения и функции. Разница между функцией и конструктором заключается в том, что вы можете делать все, что хотите, в функции, но конструктору разрешено принимать только существующие значения и делать значение другого типа без каких-либо преобразований. Конструкторы - это просто обертки вокруг значений.

Смежные вопросы