该类型的实例是什么?

时间:2017-06-29 13:12:40

标签: haskell

Monoid mempty函数的类型签名是:

*Exercises Data.Monoid> :t mempty
mempty :: Monoid a => a

当我在mempty函数的类型类Monoid上查看函数的类型签名( - >)时,它变为:

mempty :: Monoid b => a -> b

因为a将通过a -> b替换。

mempty :: Monoid a => a
mempty :: a -> b

我没有提到b必须是Monoid,否则mappend功能将无效。

现在我有以下数据类型

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)

instance (Semigroup b, Monoid b)
  => Monoid (Combine a b) where
  mempty = Combine mempty
  mappend = (<>)

mempty Combine函数签名的外观如何?

所以我将采用与上述完全相同的方式:

mempty声明:

mempty :: Monoid a => a

a将通过Combine替换,然后变为:

mempty :: Combine a b

1 个答案:

答案 0 :(得分:3)

为什么不问ghci?你有mempty = Combine mempty,所以:

> :t Combine mempty
Combine mempty :: Monoid b => Combine a b

因此,mempty Combine的类型必须至少与此类似。