-
поизучать внутренности ghc, особенности компиляции и различные
stage и помочь мне понять, есть ли там баг или почему я дурак
Вот есть мелкий пример кода, который работает не как надо:
gist.github.com
подразумевается, что после компиляции и запуска я увижу:
1
1
а выводится только:
1
т.к. в функции test. case тупо игнорируется.
Мне кажется, что проблема в типе cast, т.к. scast работает нормально (см. мой предыдущий пост). Но так же мне кажется, что даже не смотря на эту проблему должен генериться валидный кот.
[*] — оборот в рекламных целях
Replies (4)
-
@qnikst, смотрю через ghc -ddump-to-file -dshow-passes вижу в test.dump-prep
глючную функцию:
sat_s5Dv :: Main.SomeS -> GHC.Types.IO ()
[LclId, Str=DmdType]
sat_s5Dv =
\ (z_s5Ds [Occ=Once] :: Main.SomeS) ->
let {
sat_s5Dt [Occ=Once] :: Main.S GHC.Prim.Any
[LclId, Str=DmdType]
sat_s5Dt = Main.cast @ GHC.Prim.Any Main.A z_s5Ds } in
case Main.foo @ GHC.Prim.Any sat_s5Dt of _ [Occ=Dead] { }
и нормальную:
sat_s5Dr :: GHC.Types.IO Main.SomeS
[LclId, Str=DmdType]
sat_s5Dr =
let {
sat_s5Dq [Occ=Once] :: GHC.Types.IO (Main.S 'Main.A)
[LclId, Str=DmdType]
sat_s5Dq =
let {
sat_s5Dp [Occ=Once] :: GHC.Types.Int
[LclId, Str=DmdType]
sat_s5Dp = GHC.Types.I# 3 } in
$cmkVal_r5BI sat_s5Dp } in
GHC.Base.fmap
@ GHC.Types.IO
GHC.Base.$fFunctorIO
@ (Main.S 'Main.A)
@ Main.SomeS
(Main.SomeS @ 'Main.A)
sat_s5Dq
/2 · Reply -
@qnikst, ступил, вот нормальная:
sat_s5Do :: Main.SomeS -> GHC.Types.IO ()
[LclId, Str=DmdType]
sat_s5Do =
\ (z_s5Dk [Occ=Once] :: Main.SomeS) ->
let {
sat_s5Dl [Occ=Once] :: Main.S 'Main.A
[LclId, Str=DmdType]
sat_s5Dl = Main.cast @ 'Main.A Main.A z_s5Dk } in
case Main.foo @ 'Main.A sat_s5Dl
of [Occ=Dead] { Main.V1 [Occ=Dead] i_s5Dn [Occ=Once] ->
System.IO.print @ GHC.Types.Int GHC.Show.$fShowInt i_s5Dn
}