Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 基于约束区分类型_Haskell_Type Constraints_Type Families - Fatal编程技术网

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