Haskell GADT与平等性证明

Haskell GADT与平等性证明,haskell,types,gadt,Haskell,Types,Gadt,我想在GADT中隐藏一些类型信息,这里忘记了键类型 data Query where Query :: Ord key => Map.Map key String -> Query one :: Ord key => key -> Query one k = let m = Map.insert k "hello" Map.empty in Query m 我如何传递一些等式约束以在其他地方使用它,如: other :: Ord key

我想在GADT中隐藏一些类型信息,这里忘记了
类型

data Query  where
   Query :: Ord key =>  Map.Map key String  -> Query

 one ::  Ord key => key -> Query
 one  k =
   let m = Map.insert k "hello" Map.empty
   in Query m
我如何传递一些等式约束以在其他地方使用它,如:

other :: Ord key => key -> Query -> Maybe String
other k (Query ad) =  Map.lookup k ad

–1月6日17:19左右向左


如果你只是让类型变量保持可见——但普遍量化——那么其他人也必须抽象地对待它,但当你想要访问它并应用你所拥有的任何约束时,它仍然存在。-如果您确实有一个全局证明,证明所有键都具有相同的类型,那么您根本不应该将其作为变量。如果您只有两个或三个这样的类型(并且不打算允许更多),那么您也不应该使用类型变量,而应该使用具有不同实例化的离散选项的变量类型

隐藏类型信息的意义在于,你不能这样做,不是吗?绝对不能。但不忘记=忘记+有类型相等的证明。这就是我想做的,不要带着所有这些参数到处走。作为客户机,不应允许其他人查看它是什么类型。但是我也是作为一个实现者来写的,因此我想保留证据。你能给出一个完整场景的例子吗?如果你只是保持类型变量可见——但普遍量化——那么其他人也必须抽象地对待它,但当你想访问它并应用你所拥有的任何约束时,它仍然在那里。-如果您确实有一个全局证明,证明所有
都具有相同的类型,那么您根本不应该将其设为变量。如果您只有两个或三个这样的类型(并且不打算允许更多),那么也不应该使用类型变量,而应该使用一个变量类型,该变量类型具有用于不同实例化的离散选项。@leftaroundabout:您的注释给出了一个非常合适的答案。