Haskell GADT与平等性证明
我想在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
键
类型
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:您的注释给出了一个非常合适的答案。