2017-06-29 48 views
0

从含半幺群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 

+0

你忘了约束'Monoid b'。 'mempty :: Monoid b =>合并一个b'。 '合并一个b'只是'a - > b'的一个包装。所以它基本上是'Monoid b => a - > b'。 '=>'之前的部分是typeclass,它在编译时被相应的类型字典替换。它告诉编译器如何产生一个'b'类型的值。 – ftor

回答

3

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

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

。因此memptyCombine类型必须至少与特定的作为。

相关问题