是否可以在不假设类型构造函数的名称的情况下为泛型类型(在本例中为应用程序)编写函数?
我可以写以下内容:
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
出于某种原因,这会给我一个语法错误,即使它与 and 具有相同的gt
结构gu
。
如果没有办法做到这一点,那为什么不呢?