具有包含函数的数据类型的半群

时间:2017-06-28 07:53:57

标签: haskell

我有以下数据类型和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)是什么意思?我将函数fg传递给二元运算符<>它的输出是什么?

为了弄清楚它是如何运作的,我试着在前奏中发挥作用:

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

1 个答案:

答案 0 :(得分:4)

f <> g正在为函数调用库实例:

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

所以,它是逐点定义的。

也许使用广义newtype派生在这里会更好,因为Combine具有完全相同的实例。人们甚至可能想知道是否需要Combine