如何在Haskell中的嵌套数据类型中进行更改

时间:2018-02-27 19:59:12

标签: haskell functional-programming

我明白了:

type ID = Int

data Bank = Bank [(ID, Account)] deriving Show

data Account = Account
  { balance :: Int
  , owner :: Client
  } deriving Show

data Client = Client
  { name :: String
  , surname :: String
  , address :: String
  } deriving Show

我的任务是,写一个函数credit :: Int -> ID -> Bank -> Bank 将指定金额添加到指定金额 帐户。 我不知道我怎么能这样做,因为这些是数据类型..

1 个答案:

答案 0 :(得分:5)

由于您使用记录语法定义了Account,我们将再次使用记录语法对帐户进行更改。

如何修改Account以向其添加资金:

creditAccount :: Int -> Account -> Account
creditAccount amount acct = acct { balance = balance acct + amount }

要修改Bank,我们将使用模式匹配对其进行解构,以获取accounts的基础列表,然后使用Bank构造函数来解除结果列表返回Bank类型。

如何通过修改特定帐户来修改Bank

modifyAccount :: ID -> (Account -> Account) -> Bank -> Bank
modifyAccount i f (Bank accounts) = Bank (map g accounts)
  where 
    g (i', acct) = (i', if i == i' then f acct else acct)

汇总,如何通过贷记特定帐户来修改Bank

credit :: Int -> ID -> Bank -> Bank
credit amount i = modifyAccount i (creditAccount amount)