@fmap, есть данные приходящие из FFI кода: S s a (грубо говоря враппер вокруг pointer), есть GADT (H s a) их описывающий с конструкторами для каждого конкретного a. Есть метод hexp :: S s a -> H s a, который работает примерно так:
unsafeInlinIO . . peek . unS, где peek это
peek :: Ptr (H s a) -> H s a
peek p = case typeOf p of
C1 -> unsafeCoerce $ realPeek (unsafeCoerce p)
....
в итоге эта байда сносит ghc крышу. Проблема тут в том, что а). мне кажется что в оптимизациях есть баг судя по генерируемым стейджам), б). 'a' не всегда выводится верно.
Для S есть экзестенциальный тип SomeS, который выдается когда настоящий S неизвестен, и там это спасает. Но тут как-то все хуже, у меня есть:
case (hexp . (cast :: SSINGTYPE a -> SomeSEXP s -> S s a) R.Int s) of
тут case повсем возможным веткам
так вот я думаю, как мы уменьшить ghc ум, чтобы он лишнего не выводил и ленюсь дебажить..