在具有多个类型类的自定义数据类型上使用函子/应用程序?

时间:2016-10-21 10:09:36

标签: haskell functor applicative custom-data-type

考虑具有两个参数a和b的Users类型。显然,这使用户可以由两种不同的类型组成:

data Users a b = User a b deriving (Show, Eq, Ord)

我们如何为此实例声明仿函数和应用程序?

我尝试过这些方法无法编译:

instance Functor Users where
   fmap f(User a b) = User (f a) (f b) 

instance Applicative Users where
   pure a b = User a b
   (<*>) User a b = (fmap a) (fmap b)

这些不能编译的原因是什么?

1 个答案:

答案 0 :(得分:5)

查看Data.Bifunctor的ADT类型类,它们都是两个参数中的函数。 User只是元组的一个奇特名称,这已经支持了这样一个实例。在Haskell中可以派生一个bifunctor实例。

@Bakuriu建议将User定义为newtype,并使用扩展名GeneralizedNewtypeDeriving

对于第二个,请参阅Biapplicative。正如所料,(,)的实例是:

instance Biapplicative (,) where
  pure = (,)
  ap (f, g) (a, b) = (f a, g b)