У меня есть ситуация, когда я в данный момент использую чрезвычайно страшную функцию unsafeCoerce. К счастью, это не для чего-то важного, но мне было интересно, кажется ли это безопасным использованием этой функции, или есть ли другой способ решить эту конкретную проблему, о которой знают другие люди.
Код у меня примерно такой:
data Token b = Token !Integer
identical :: Token a -> Token b -> Bool
identical (Token a) (Token b) = a == b
data F a = forall b. F (Token b) (a -> b)
retrieve :: Token b -> F a -> Maybe (a -> b)
retrieve t (F t' f) = if identical t t' then Just (unsafeCoerce f) else Nothing
Следует отметить еще две вещи: эти токены используются внутри монады, которую я использую, чтобы гарантировать, что поставка целых чисел для них уникальна (т. Е. Я не делаю один и тот же токен дважды). Я также использую количественную переменную теневого типа forall, точно так же, как и монада ST, чтобы убедиться, что (при условии, что используются только методы, которые я раскрываю в модуле) нет способа вернуть токен (или фактически даже F) из монады без ошибки типа. Я также не открываю конструктор токенов.
Я думаю, насколько я вижу, это должно быть безопасным использованием unsafeCoerce, так как я могу сказать с (надеюсь) довольно высокой уверенностью, что значение, которое я принуждаю, на самом деле именно того типа, к которому я принуждаю его. , но могу ошибаться. Я также пытался использовать Data.Typeable, который прекрасно работает, но на данный момент я пытаюсь это сделать, чтобы избежать ограничения Typeable, тем более что gcast, похоже, делает что-то во многом похожее, и мне все равно понадобятся токены, чтобы различать разные F одного и того же типа.
Большое спасибо за любую помощь/совет.
Data.Typeable
, который используетunsafeCoerce
под прикрытием для реализацииcast
. - person Nathan Howell   schedule 14.01.2013cast
, то использованиеunsafeCoerce
безопасно, но вы теряете сгенерированные компиляторомtypeOf
/TypeRep
. Вы можете использоватьTypeRep
вместоInteger
в своем токене. - person Nathan Howell   schedule 14.01.2013