Я пытаюсь заполнить дыру в следующем фрагменте
import Data.Proxy
import GHC.TypeLits
import Data.Type.Equality
import Data.Type.Bool
import Unsafe.Coerce
ifThenElse :: forall (a :: Nat) (b :: Nat) x l r.
(KnownNat a, KnownNat b, x ~ If (a==b) l r) =>
Proxy a -> Proxy b -> Either (x :~: l) (x :~: r)
ifThenElse pa pb = case sameNat pa pb of
Just Refl -> Left Refl
Nothing -> Right $ unsafeCoerce Refl -- This was the hole
Является ли это возможным?
Изменить: проверен источник sameNat
< /a> и оказалось, что они используют unsafeCoerce
. Я отредактировал код выше соответственно.
Nat
(а не сломанным вGHC.TypeLits
). Как вам удалось загнать себя в этот конкретный угол? Возможно, мы сможем посоветовать вам, как переделать вашу программу, чтобы вам не требовались такие корявые доказательства. - person Benjamin Hodgson♦   schedule 15.02.2017Generic1
, который должен иметь структуруE s = E0 s | E1 O1 (E s) | E2 O2 (E s) | ...
. Я реализовал различные общие функции, поэтому, похоже, он работает. Мне нужен безопасный способ извлечьOi
из заданной арностиi
безопасным способом. Итак (для некоторого понятияi :: Nat
)getOp :: Proxy i -> e s -> Maybe (OpType i e)
. Посколькуi
известен во время компиляции, GHC может (и делает) сделать вывод о точном типе приведенной выше подписи на каждом сайте вызова. - person fakedrake   schedule 15.02.2017Nat
(который можно легко преобразовать из арности в глубину дерева), потому что GHC должен иметь возможность проверять тип каждого шага, поэтому мне нужно сказать ей (я вижу это как мать фиуре) как разобраться в типах. - person fakedrake   schedule 15.02.2017(Op :*: recur) :+: rest
, тип которого получен изIf (c==n) Op (OpType' (c+1) n rest)
.c
— текущая глубина, n — целевая глубина, я отслеживаюn
и увеличиваюc
вместо уменьшенияn
, потому что мне удобнее увеличивать, чем уменьшать понятие натуральных чисел GHC. В случаеc==n
GHC может выяснить, что это типOp
, и проверить все типы. В противном случае она не может доказать, чтоc==n
и жалуется на проверку типов. - person fakedrake   schedule 15.02.2017