Haskell 像函数一样组合类型构造函数
我最近遇到了一种情况,我希望能够在实例声明中组合类型构造函数。我希望这样做:Haskell 像函数一样组合类型构造函数,haskell,Haskell,我最近遇到了一种情况,我希望能够在实例声明中组合类型构造函数。我希望这样做: instance (SomeClass t, SomeClass t') => SomeClass (t . t') where 定义了(t.t'),使得(t.t')a=t(t'a)(所以t和t'有种类*->*。我们可以部分地应用类型构造函数,比如函数,那么我们不能组合它们的原因是什么呢?另外,对于我试图实现的东西,可能有解决方法吗?可能有等式约束 (我确实知道它的存在,但它只是创建了一个newtype包装器-
instance (SomeClass t, SomeClass t') => SomeClass (t . t') where
定义了(t.t')
,使得(t.t')a=t(t'a)
(所以t
和t'
有种类*->*
。我们可以部分地应用类型构造函数,比如函数,那么我们不能组合它们的原因是什么呢?另外,对于我试图实现的东西,可能有解决方法吗?可能有等式约束
(我确实知道它的存在,但它只是创建了一个newtype
包装器-我想要一个类型同义词)
(我知道存在Control.Compose
,但它只是创建了一个
newtype
wrapper-我想要一个类型同义词)
这在Haskell中是不允许的。必须完全应用类型同义词:不能编写composett'
,只能编写composeta
允许部分应用类型同义词将导致类型级别的lambda,这使得类型推理不可判定,因此Haskell中缺乏对它的支持
例如,(启用所有相关GHC扩展) 结果:
Type synonym ‘Compose’ should have 3 arguments, but has been given 2
In the type signature for ‘pr’: pr :: Proxy (Compose [] [])
同样地
class C k where f :: k Int -> Int
instance C (Compose [] []) where f _ = 6
收益率:
Type synonym ‘Compose’ should have 3 arguments, but has been given 2
In the instance declaration for ‘C (Compose [] [])’
下面是一个示例,其中允许使用类型同义词部分应用程序(启用liberaltypeesynonyms
):
然而,请注意,这只起作用,因为在同义词扩展之后,我们得到了一个完全应用的类型
[]([]Int)
(即[[Int]]
)。大致上,此功能不允许手动扩展同义词。尽管在某些情况下,-XLiberalTypeSynonyms
允许部分应用类型同义词,但此功能不允许手动扩展同义词。不过,在这种情况下,答案很好。类型级别的lambdas
正是int的类型我正在寻找的工具。类型推理是不可判定的,类型级别为lambada。
Type synonym ‘Compose’ should have 3 arguments, but has been given 2
In the instance declaration for ‘C (Compose [] [])’
type T k = k Int
type S = T (Compose [] [])
bar :: S -> S
bar = map (map succ)