1

是否可以在不假设类型构造函数的名称的情况下为泛型类型(在本例中为应用程序)编写函数?

我可以写以下内容:

f :: Maybe a -> Maybe a
f (Just a) = (Just a)

那一个适用于Maybes 并且仅适用于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)

在这种情况下TU是同构的,但也许它们也将具有对真实示例中的任何一个都是特殊的构造函数......在这里无关紧要。

现在,如果想要一个同时在TU...上运行的函数怎么办?我可以将函数编写两次,如下所示:

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

如果没有办法做到这一点,那为什么不呢?

4

0 回答 0