私はHaskell Book(第15章「Monoid、Semigroup」)でSemigroup演習の1つをしようとしていますが、私は立ち往生しています。このデータ型のSemigroupインスタンスの記述方法は?
newtype Combine a b =
Combine { unCombine :: (a -> b) }
と私はCombine
ためSemigroup
インスタンスを書くことになってる:以下が与えられます。
そして本は、それは以下のように振る舞う必要があることを述べている:
Prelude> let f = Combine $ \n -> Sum (n + 1)
Prelude> let g = Combine $ \n -> Sum (n - 1)
Prelude> unCombine (f <> g) $ 0
Sum {getSum = 0}
Prelude> unCombine (f <> g) $ 1
Sum {getSum = 2}
Prelude> unCombine (f <> f) $ 1
Sum {getSum = 4}
Prelude> unCombine (g <> f) $ 1
Sum {getSum = 2}
そのタイプはチェックだから私は最初間違った溶液を用いて開始しました:
期待されていないものをinstance Semigroup (Combine a b) where
Combine f <> Combine g = Combine f
もちろん、正しい方向への一歩です。 何かがビーイングこと
instance Semigroup (Combine a b) where
(Combine f) <> (Combine g) = Combine (SOMETHING)
:そして、私の考えは、擬似コードでは、次のようなもの、であるf
とg
を追加、その具体的な付加操作が何であれ(それはf
とg
によって異なります)。だから私はこれがからData.Monoid
まで必要と思うが、私はすでにimport Data.Semigroup
を自分のコードに持っているので、<>
からData.Monoid
はData.Semigroup
のものと一致する。では私は何をすべきですか?
私は「Combine(f Monoid's <> g)」のように何かを述べることができましたが、見つけられませんでした。
GHC 8.xを使用していない限り、私はSemigroup
をインポートする必要があります。<>
からMonoid
に「shadow」がある可能性があります。しかし、私はこの影響をどのようにして見つけるか苦労しています。
アイデア?
したがって、結合のSemigroupインスタンスのみを書き込むことはできませんか?私はMonoidを余儀なくされましたか?私は少し混乱しています。 –
@EmreSevinçCombineは実際にはセミグループになることができ、2番目の値だけがセミグループになる必要があります(インスタンスVには 'mempty 'は呼び出されません)。 –
本当に、私は 'Semigroup b'だけで答えを更新しました –