如何解决我的GADT中的歧义

布兰登·奥格尔(Brandon Ogle)

我有两个用于模拟SQL EDSL的GADT。为了使面向API的客户端保持整洁和简单,我想使用OverloadedStrings将字符串文字转换为Column Selection

因此,您只需键入

select ["a", "b"] $ from tbl

代替

select [Column "a", Column "b"] $ from tbl

问题是select允许Column Selections和Reductions都允许执行聚合的查询。

mean :: Column Selection -> Column Reduction

select :: [Column a] -> Query b -> Query Selection
select [mean "a"] $ from tbl

因此在这种情况下字符串是不明确的[Column a]但是select [mean "a"] $ from tbl有效,因为mean它提供了必要的上下文来推断字符串文字是“列选择”。

谁能推荐摆脱这种混乱的出路?

我下面的当前代码(忽略了无关的实例)

{-# LANGUAGE 
    GADTs
  , RankNTypes
  , DataKinds
  , TypeFamilies
  , FlexibleContexts
  , FlexibleInstances
  , OverloadedStrings #-}

data Sz = Selection | Reduction deriving Show
data Schema = Schema{name :: Maybe String, spec :: [Column Selection]} 

type family ColOp (a :: Sz) (b :: Sz) where
    ColOp Selection Selection = Selection
    ColOp Selection Reduction = Selection
    ColOp Reduction Selection = Selection
    ColOp Reduction Reduction = Reduction

data Column (a :: Sz) where
    Column  :: String -> Column Selection
    Assign  :: String -> Column a -> Column a
    FKey    :: String -> Schema -> Column Selection
    BinExpr :: BinOp  -> Column a -> Column b -> Column (ColOp a b)
    LogExpr :: LogOp  -> Column a -> Column b -> Column Selection
    AggExpr :: AggOp  -> Column Selection -> Column Reduction

instance IsString (Column Selection) where
    fromString s = Column s

data Query (a :: Sz) where
    Table  :: Schema -> Query Selection
    Select :: [Column a] -> Query b -> Query Selection
    Update :: [Column a] -> Query b -> Query Selection
    Where  :: [Column Selection] -> Query Selection -> Query Selection
    Group  :: [Column Selection] -> Query Selection -> Query Reduction

我也想提出以下签名失败Select/ Update

[Column Selection] -> Query Reduction -> Query Selection

但这就是蠕虫的另一罐……

用户名

编译器是正确的,将为您带来模棱两可的类型错误Select ["a"]-已知先验参数为时IsString (Column Selection)可以选择实例这正是预期的行为。ColumnSelection

您想要的是以下内容:

instance (x ~ Selection) => IsString (Column x) where
    fromString = Column 

这将允许编译器推断"x" :: Column _必须实际为"x" :: Column Selection,而不是要求

Select [mean "a"]这是完全不同的情况-因为mean :: Column Selection -> Column Reduction,编译器在实例选择发生之前就知道"a" :: Column Selection,因为mean强制类型是这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何解决cucumberjs中的歧义问题?

来自分类Dev

如何解决这种歧义?

来自分类Dev

如何解决这种歧义?

来自分类Dev

如何解决方法引用中的重载歧义?

来自分类Dev

如何解决通用扩展方法中的这种歧义?

来自分类Dev

如何解决Swift中的歧义类型错误?

来自分类Dev

如何解决Qt插槽中功能的歧义

来自分类Dev

如何解决传递给Boost线程的函数中的歧义

来自分类Dev

引用如何解决多重继承中的歧义?

来自分类Dev

如何解决以下代码中的函数重载歧义

来自分类Dev

如何解决钻石问题的这种歧义

来自分类Dev

当我们使用USERELATIONSHIP时,power bi如何解决歧义?

来自分类Dev

如何解决Scala中采用相同输入类型的歧义隐式转换方法?

来自分类Dev

哈希表如何解决存储桶的歧义和探测?

来自分类Dev

在while循环中添加中断如何解决过载歧义?

来自分类Dev

如何解决对重载定义的歧义引用

来自分类Dev

如何解决“ fpclassify”:对重载函数的歧义调用

来自分类Dev

如何解决歧义和冲突LR解析器?

来自分类Dev

我该如何解决?我在程序中解释

来自分类Dev

我该如何解决

来自分类Dev

我该如何解决?

来自分类Dev

我该如何解决流星js中的--port错误

来自分类Dev

mongodb错误。我该如何解决mongoDB中的错误?

来自分类Dev

我如何解决TensorFlow中的``gpu内存不足''

来自分类Dev

我该如何解决Windows 10中的模糊文本?

来自分类Dev

如何解决我的Jsp程序中的错误?

来自分类Dev

我如何解决primefaces中的头部目标

来自分类Dev

如何解决我的 Android 中的 NullPointerException 问题

来自分类Dev

如何解决在我的模板中打开页面的问题?

Related 相关文章

热门标签

归档