gpt4 book ai didi

haskell - 如何将类型(种类?)限制为仅产品类型

转载 作者:行者123 更新时间:2023-12-02 18:24:14 26 4
gpt4 key购买 nike

我正在研究使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com