0

Haskellに次のものがあるとしましょう。

type Bag a = a -> Int

data Gems = Sapphire|Emerald|Diamond|Ruby deriving (Show)

myBag :: Bag Gems
myBag Sapphire = 3
myBag Diamond = 2
myBag Emerald = 0 

emptyBag :: Bag Gems
emptyBag Sapphire = 0
emptyBag Diamond = 0
emptyBag Emerald = 0

addItemxbがアイテムxの単一のオカレンスをバッグbに追加するように関数addItemをどのように定義しますか?

4

2 に答える 2

2

次のタイプの関数が必要です

addItem :: Gems -> Bag Gems -> Bag Gems

これの定義はBagGemsと同じであることに注意してください

addItem :: Gems -> (Gems -> Int) -> Gems -> Int

addItemしたがって、の定義が始まることを期待しています

addItem gemToAdd bag gem = --some Int expression

さて、ロジックについても考えてみましょう

  1. gemが私たちとは異なる宝石である場合、私たちに与えられるgemToaAddものを取り除く必要がありますbag
  2. それが私たちがもう1つ取得する必要があるよりも同じである場合

したがって

addItem gemToAdd bag gem = if gem == gemToAdd then (bag gem) + 1 else bag gem

あなたも書くことができます

addItem gemToAdd bag gem | gem == gemToAdd = (bag gem) + 1
                         | otherwise       = bag gem

現在、Eqは定義されていないため、これによりエラーが発生しますGems。それを修正する最も簡単な方法は、定義することです

data Gems = Sapphire|Emerald|Diamond|Ruby deriving (Show, Eq)

そして、あなたは完了です

于 2013-01-05T04:47:14.777 に答える