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

Ger*_*Nab -2 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
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*tin 5

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

如何修改Account以增加资金:

creditAccount :: Int -> Account -> Account
creditAccount amount acct = acct { balance = balance acct + amount }
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

将它们放在一起,如何Bank通过贷记特定帐户来修改a :

credit :: Int -> ID -> Bank -> Bank
credit amount i = modifyAccount i (creditAccount amount)
Run Code Online (Sandbox Code Playgroud)