我有以下数据类型和Semigroup
实例:
newtype Combine a b =
Combine { unCombine :: a -> b }
instance (Semigroup b)
=> Semigroup (Combine a b) where
Combine {unCombine=f} <> Combine {unCombine=g} = Combine (f <> g)
Combine (f <> g)
是什么意思?我将函数f
和g
传递给二元运算符<>
它的输出是什么?
为了弄清楚它是如何运作的,我试着在前奏中发挥作用:
Prelude> let f = Combine $ \n -> Sum (n + 1)
Prelude> let g = Combine $ \n -> Sum (n - 1)
Prelude> unCombine (f <> g) $ 0
Sum {getSum = 0}
对我来说,它看起来像f
之后的函数组合g
,但我不确定,究竟是如何工作的。有人能告诉我,它是如何工作的?
另一个例子(也许没有意义):
*Exercises Data.Semigroup> data Zoo a b = Zoo (a -> b)
*Exercises Data.Semigroup> x = Zoo (+23)
*Exercises Data.Semigroup> :t x
x :: Num b => Zoo b b
如何使用x
?
答案 0 :(得分:4)
f <> g
正在为函数调用库实例:
instance Semigroup b => Semigroup (a -> b) where
f <> g = \x -> f x <> g x
所以,它是逐点定义的。
也许使用广义newtype派生在这里会更好,因为Combine
具有完全相同的实例。人们甚至可能想知道是否需要Combine
。