我有一个关于类型参数的问题,我认为最好通过一个例子来表达。以下是这段代码:
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
,但当然这个文字表示法表达了映射类型。
编辑2:在发布问题之前,我总是尝试将其剥离到抽象的核心,但这似乎掩盖了我实际想要的内容。因此,这个问题的一个具体变体现在 这里。
TypeSynonymInstances
GHC扩展,你可以这样做:type TripleSynonym a c b = (a, b, c)
,然后instance Functor (TripleSynonym a c)
。但是不行:在这种情况下,GHC不允许你部分地评估类型。 - Stefan Witzel