鉴于此类型:
data Two a b = Two a b deriving (Eq, Show)
适用的定义是什么?如果没有在pure
添加约束,我就无法获得a
权限,例如Num a
instance (Num a, Monoid a) => Applicative (Two a) where
pure b = Two 1 b
Two f f' <*> Two a b = Two a (f' b)
答案 0 :(得分:3)
如果没有约束,你就无法拥有它。您需要对a
执行某些操作,并且能够对该类型执行操作,您可以通过两种方式获取操作:使用特定类型(例如Int
或抽象类型) ,需要一个类型类实例)。
在这种情况下,最常见的约束是Monoid
,它使您的实例与2元素元组相同:
instance Monoid a => Applicative ((,) a) where
pure x = (mempty, x)
(u, f) <*> (v, x) = (u `mappend` v, f x)