- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究使用 monad 推导式来表示 SQL 查询,并生成适当的 SQL。乍一看,这不是问题,看起来很合适。但我必须限制类型,这些类型只能形成产品的单子(monad),而不是总和,而且我想不出一种方法来放置这样的限制。
我想使用类型检查器来确保只能使用 SQL 中可表示的类型。
我想,我可以使用模板 haskell 来派生正确的实例,如果类型不适合则拒绝派生,但我更喜欢在类型级别完成。由于我的无知,我引入错误的机会较小。
我怎样才能做到这一点?如果是,请您推荐一些阅读和/或代码示例。
编辑:谢谢,我有一些好的路径可以遵循,需要更多的阅读:) 长周末即将到来。
最佳答案
不幸的是,这实际上是不可能的:a Monad
必须是完全多态的。这与您无法创建 Set
的原因相同一个 monad(Ord
约束)。
如果您只能处理结果类型满足约束的情况,那么您可能拥有 runSQL :: (Product a) => SQL a -> IO a
,或类似的。在这种情况下,只需使用 Template Haskell 派生适当的实例即可,或者使用新的 GHC Generics ;普通的 Haskell 无法确定类型是否仅由产品组成。
但我怀疑您需要访问一元计算的整个结构,将其转换为 SQL。不幸的是,单子(monad)并没有很好地做到这一点,因为它们与任意 Haskell 函数插入在一起,而你无法“查看内部”。 Arrows更接近,可以让您进行更多静态分析,但仍然有那个讨厌的 arr
这又可以让你潜入任意 Haskell 函数。
做这样的事情最可行的选择可能是编写一个 Template Haskell 拼接器来解析你想要的语法;你可以说$(sql [| [ (a,b) | a <- table1, b <- table2 |])
并有sql
在编译时将 AST 转换为相应的 SQL 如果该语法太丑陋,则可以使用 haskell-src-meta 编写 use a quasiquoter ,看起来像 [sql| (a, b) | a <- table1, b <- table2 |]
.
您可能还对 generalised arrows 感兴趣扩展,尽管对于您的目的来说它可能有点过大(而且实验性太强)。
关于haskell - 如何将类型(种类?)限制为仅产品类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031417/
我是一名优秀的程序员,十分优秀!