Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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 - Fatal编程技术网

Haskell 如何仅将类型(种类?)约束到产品类型

Haskell 如何仅将类型(种类?)约束到产品类型,haskell,Haskell,我正在研究使用monad理解来表示SQL查询,并生成适当的SQL。乍一看,这不是问题,似乎很适合。但是我必须限制这些类型,这些类型只能构成单子的乘积,不能求和,我想不出一种方法来设置这样的限制 我想使用类型检查器来确保只能使用SQL中可表示的类型 我想,我可以使用模板haskell来派生正确的实例,如果类型不适合,我会拒绝派生,但我更希望在类型级别进行。由于我的无知,我引入bug的机会减少了 我怎么能这样做?如果是,请推荐一些阅读和/或代码示例 编辑:谢谢,我有一些好方法要遵循,需要更多的阅读:

我正在研究使用monad理解来表示SQL查询,并生成适当的SQL。乍一看,这不是问题,似乎很适合。但是我必须限制这些类型,这些类型只能构成单子的乘积,不能求和,我想不出一种方法来设置这样的限制

我想使用类型检查器来确保只能使用SQL中可表示的类型

我想,我可以使用模板haskell来派生正确的实例,如果类型不适合,我会拒绝派生,但我更希望在类型级别进行。由于我的无知,我引入bug的机会减少了

我怎么能这样做?如果是,请推荐一些阅读和/或代码示例


编辑:谢谢,我有一些好方法要遵循,需要更多的阅读:)接下来是一个漫长的周末。

不幸的是,这是不可能的:Monad必须是完全多态的。这与您不能将
Set
设置为单子(即
Ord
约束)的原因相同

如果您只能处理结果类型满足约束的问题,那么您可以使用
runSQL::(产品a)=>sqla->ioa
或类似的方法。在这种情况下,只需使用模板Haskell派生适当的实例,或者使用新的;plain Haskell无法确定类型是否仅由产品组成

但我怀疑您需要访问一元计算的整个结构,才能将其转换为SQL。不幸的是,monad并没有很好地适应这一点,因为它们与任意的Haskell函数连接在一起,您无法“查看内部”。更接近,让你做更多的静态分析,但仍然有讨厌的
arr
,再次让你潜入任意的Haskell函数


这样做最可行的选择可能是编写一个模板Haskell拼接器来解析所需的语法;你可以说
$(sql[|[(a,b)|谢谢@ehird,这确实让我深思。是的,我认为限制结果类型可能就足够了。Product类表示一个SQL行,这是SQL SELECT查询的结果,对于没有联接的查询,这应该足够了。我正在努力实现一个小型DSL,我最初的希望是达到这样一个阶段,即runSQL的结果是一个可接受的查询字符串。因此,类似于
(产品a)=>runSQL::SQL a->a
。将查询执行留给db后端执行。很抱歉,在上面的函数中,def应为
runSQL::(产品a)=>SQL a->AST a
对于某些
AST a
单子,它们不必再是完全多态的,是吗?但不知道这些是否适用于OP的问题。@leftaroundabout:是的,它们是。约束类型让您更容易定义受限的单子类型类;没有它们,仍然可能,只是更难看。t标准的
Monad
typeclass不支持这种受限的Monad。