作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做 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)
那个某物是:f
和g
附加,无论具体附加操作是什么(它取决于 f
和 g
);所以我认为这需要<>
来自Data.Monoid
,但我已经有了import Data.Semigroup
在我的代码中,因此 <>
来自Data.Monoid
与 Data.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/
我是一名优秀的程序员,十分优秀!