该类型的实例是什么?
问题描述:
从含半幺群mempty
函数的类型的签名是: - :该类型的实例是什么?
mempty :: Monoid b => a -> b
由于
*Exercises Data.Monoid> :t mempty
mempty :: Monoid a => a
当我看类型签名功能(>)类型类含半幺群为mempty
功能变得上键入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 :: Monoid a => a
a
将取代通过合并,然后就变成:
的mempty声明
mempty :: Combine a b
?
答
为什么不问ghci?你有mempty = Combine mempty
,所以:
> :t Combine mempty
Combine mempty :: Monoid b => Combine a b
。因此mempty
为Combine
类型必须至少与特定的作为。
你忘了约束'Monoid b'。 'mempty :: Monoid b =>合并一个b'。 '合并一个b'只是'a - > b'的一个包装。所以它基本上是'Monoid b => a - > b'。 '=>'之前的部分是typeclass,它在编译时被相应的类型字典替换。它告诉编译器如何产生一个'b'类型的值。 – ftor