我有一个关于类型参数的问题,我认为最好通过示例来表达。这段代码
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 _) 成为a Bar(对于所有 a、b、c)。那么那么Triple a b c
将是一个Functor
, a Foo
and a Bar
。您会考虑编写这些单参数类型a -> Triple a b c
, b -> Triple a b c
and c -> Triple a b c
当然,这种文字表示法表示映射类型。
Edit2:在 stackoverflow 上发布问题之前,我总是尝试将其剥离到其抽象核心,但这似乎掩盖了我真正想要的东西。所以现在可以找到这个问题的具体变体here https://stackoverflow.com/questions/60079676/partially-evaluated-type-in-classes.