在具有多种类型 类 的自定义数据类型上使用 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)
考虑一个带有两个参数 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)