是否可以为泛型类型(在本例中为applicatives)编写函数而不假设类型构造函数的名称?
我可以写下以下内容:
f :: Maybe a -> Maybe a
f (Just a) = (Just a)
那个适用于Maybe
s,只适用于Just
构造函数。
但是说我有不同的类型,它们的值构造函数与类型构造函数同名:
data T a = T a
instance Functor T where
fmap f (T a) = T (f a)
instance Applicative T where
pure = T
(T f) <*> (T something) = fmap f (T something)
data U a = U a
instance Functor U where
fmap f (U a) = U (f a)
instance Applicative U where
pure = U
(U f) <*> (U something) = fmap f (U something)
在这种情况下,T
和U
是同构的,但也许它们也会有一个对实际例子中的任何一个都特殊的构造函数......这里没关系。
现在如果想要一个在T
和U
上运行的函数怎么办...我可以写两次函数,如下所示:
gt :: T a -> T a
gt (T x) = T x
gu :: U a -> U a
gu (U x) = U x
还有办法为这个函数制作这样的模板吗?
g :: (Applicative f) => f a -> f a
g (f x) = f x
由于某些原因,这会给我一个语法错误,即使它与gt
和gu
具有相同的结构。
如果没有办法做到那么为什么不呢?