2016-01-06 2 views
1

Я хочу, чтобы скрыть некоторую информацию о типе в GADT, здесь забывая о 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 
+5

Это своего рода информация о скрытии информации, которую вы не можете сделать, не так ли? – leftaroundabout

+0

совершенно. но не забывая = забывая + имея доказательство равенства типа. и это то, что я хотел бы сделать, чтобы не переносить все эти параметры. в качестве клиента другим никогда не должно быть позволено видеть, какой тип он есть. но я пишу его также как разработчик, поэтому я хочу сохранить доказательство – nicolas

+1

Не могли бы вы привести пример полного сценария, в котором вы собираетесь это сделать? – leftaroundabout

ответ

1

- leftaroundabout 6 января в 17:19

Если вы просто держать тип переменной видимым - но универсально количественно - то все остальные должны относиться к нему абстрактно o, но он все еще существует, когда вы хотите получить к нему доступ и применить любые ограничения, которые вы плаваете. - Если у вас действительно есть глобальное доказательство того, что все ключи имеют один и тот же тип, то вы не должны делать его переменной вообще. Если у вас есть только два или три таких типа (и вы не планируете допускать еще много), вы не должны использовать переменную типа, но тип варианта, который имеет отдельные варианты для разных экземпляров.

Смежные вопросы