在具有多种类型 类 的自定义数据类型上使用 functors/applicatives?

Using functors/applicatives on custom data types with multiple type classes?

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

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)

这些无法编译的原因是什么?

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

中可以导出双函子实例

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

第二个,见Biapplicative。不出所料,(,) 的实例是:

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