定义独立于特定值构造函数的函数(模板?)

时间:2018-02-20 02:27:43

标签: templates haskell constructor type-constructor value-constructor

是否可以为泛型类型(在本例中为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)

在这种情况下,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

由于某些原因,这会给我一个语法错误,即使它与gtgu具有相同的结构。

如果没有办法做到那么为什么不呢?

0 个答案:

没有答案