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
答案 0 :(得分:3)
为什么不问ghci?你有mempty = Combine mempty
,所以:
> :t Combine mempty
Combine mempty :: Monoid b => Combine a b
因此,mempty
Combine
的类型必须至少与此类似。