【发布时间】:2020-02-06 00:08:29
【问题描述】:
我有一个关于类型参数的问题,我认为最好用一个例子来表达。这段代码
newtype Triple a b c = T (a,b,c)
instance Functor (Triple a b) where
fmap f (T (x, y, z)) = T (x, y, (f z))
将三元组表示为第三个变量中的函子。
- 如何将它们转换为第二个变量中的函子?
- 如何将实际元组(不是我的新类型)转换为仿函数?
一般的问题是:假设我有一个参数类型m a b c d e,我如何表达固定一个参数得到的参数类型m a b d e?或者等价的,如何表示将任意参数设为最后一个得到的参数类型m a b d e c?
编辑:我的意思可能不太清楚,所以我想澄清一下:Triple 有一种* -> * -> * -> *。因此,我可以对两种类型进行部分评估,以获得类似 * -> * 的东西,它可能是 Functor 或其他一些参数化类。这种评估很容易在前两个参数上进行,但原则上可以在任何两个参数上进行,我在问如何做到这一点。这实质上是在类型级别上要求flip。
作为一个具体的用例,我可以有三个参数化类 Functor、Foo 和 Bar,我希望 (Triple _ b c) 成为 Functor, (Triple a _ c) 成为 Foo,并且 (Triple a b _ ) 成为 Bar(对于所有 a、b、c)。那么Triple a b c 将是Functor、Foo 和Bar。您可能会考虑编写这些单参数类型 a -> Triple a b c、b -> Triple a b c 和 c -> Triple a b c,但当然这种文字符号表示映射类型。
Edit2:在 stackoverflow 上发布问题之前,我总是尝试将其剥离到其抽象核心,但这似乎掩盖了我真正想要的东西。所以现在可以找到这个问题的具体变体here。
【问题讨论】:
-
你可能认为使用
TypeSysnonymInstancesghc 扩展你可以做type TripleSynonym a c b = (a, b, c)然后instance Functor (TripleSynonym a c)但不是:在这种情况下,ghc 不允许你部分评估类型。