Haskell 基于约束区分类型
首先,我将解释我的问题的简化版本,然后是实际问题 考虑Haskell 基于约束区分类型,haskell,type-constraints,type-families,Haskell,Type Constraints,Type Families,首先,我将解释我的问题的简化版本,然后是实际问题 考虑max和(+) 请注意,它们仅因约束不同而有所不同。我想写一个F型族,所以我得到了如下结果: f :: a -> F a 所以 f max 有不同类型的 f (+) 现在是实际问题 (从我的包裹中)提供: 我希望能够编写mkPoly(+),而无需自己明确指定约束 我想也许我可以创建一个类型族,将类型转换为约束,因为这是一个相当机械的过程 这就是我问题背后的背景,但我认为问一个更简单的问题会是一个好的开始。我认为这在总体上是不可判定
max
和(+)
请注意,它们仅因约束不同而有所不同。我想写一个F型族,所以我得到了如下结果:
f :: a -> F a
所以
f max
有不同类型的
f (+)
现在是实际问题
(从我的包裹中)提供:
我希望能够编写mkPoly(+)
,而无需自己明确指定约束
我想也许我可以创建一个类型族,将类型转换为约束,因为这是一个相当机械的过程
这就是我问题背后的背景,但我认为问一个更简单的问题会是一个好的开始。我认为这在总体上是不可判定的;请注意,
(+)::Num a=>a->a->a
,但同样有效的是,它具有类型(Num a,Eq a,Show a)=>a->a->a
。在这种情况下,F(numa=>a->a->a)
的结果类型应该是什么?我刚刚意识到这与我最近写的文章有些关联。IDK,如果它对您正在做的事情有帮助的话。这将需要不确定类型(实际上不起作用),因为应用程序f(+)
需要在f
到的类型中为所有x实例化a
。Num x=>x->x->x
。如果您的目标是对函数符号有一个简单的语法,请考虑使用TH--您将能够分析参数的实际多态类型。请注意,(+)::Num a=>a->a->a
,但同样有效的是,它具有类型(Num a,Eq a,Show a)=>a->a->a
。在这种情况下,F(numa=>a->a->a)
的结果类型应该是什么?我刚刚意识到这与我最近写的文章有些关联。IDK,如果它对您正在做的事情有帮助的话。这将需要不确定类型(实际上不起作用),因为应用程序f(+)
需要在f
到的类型中为所有x实例化a
。Num x=>x->x->x
。如果您的目标是对函数符号有一个简单的语法,请考虑使用TH--您将能够分析参数的实际多态类型。
f (+)
data Poly (c :: * -> Constraint) where
Poly :: { getPoly :: (forall a. c a => a) } -> Poly c