gpt4 book ai didi

haskell - 如何为这种数据类型编写 Semigroup 实例?

转载 作者:行者123 更新时间:2023-12-02 17:05:38 26 4
gpt4 key购买 nike

我正在尝试做 Haskell Book 中的半群练习之一(第 15 章,“幺半群,半群”)但我陷入了困境。现给出如下:

newtype Combine a b =
Combine { unCombine :: (a -> b) }

我应该写Semigroup Combine 的实例.

然后书上说它的行为必须如下所示:

 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)

那个某物是:fg附加,无论具体附加操作是什么(它取决于 fg );所以我认为这需要<>来自Data.Monoid ,但我已经有了import Data.Semigroup在我的代码中,因此 <>来自Data.MonoidData.Semigroup 中的一致。那我该怎么办?

我试图找出如何表达“Combine (f Monoid's <> g)”之类的内容,但找不到。

这本书还指出,除非我使用 GHC 8.x,否则我必须导入 Semigroup我可能有“影子”<>来自Monoid ;但我正在努力找出如何达到这种效果。

有什么想法吗?

最佳答案

他们想要的大概是功能的增加。为此,类型 b 需要是 Semigroup :

import Data.Semigroup

newtype Combine a b =
Combine { unCombine :: (a -> b) }

instance Semigroup b => Semigroup (Combine a b) where
(Combine f) <> (Combine g) = Combine (\x -> f x <> g x)

关于haskell - 如何为这种数据类型编写 Semigroup 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39456716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com