• programming ghc specialolympic Только сегодня и только сейчас [*] у вас есть отличная возможность
    поизучать внутренности ghc, особенности компиляции и различные
    stage и помочь мне понять, есть ли там баг или почему я дурак

    Вот есть мелкий пример кода, который работает не как надо:
    gist.github.com
    подразумевается, что после компиляции и запуска я увижу:

    1
    1

    а выводится только:

    1

    т.к. в функции test. case тупо игнорируется.

    Мне кажется, что проблема в типе cast, т.к. scast работает нормально (см. мой предыдущий пост). Но так же мне кажется, что даже не смотря на эту проблему должен генериться валидный кот.

    [*] — оборот в рекламных целях

Replies (4)

  • @qnikst, UPD, при добавлении явной аннотации типа в test:

    let y = cast A :: S A

    все тоже магическим образом исправляется
  • @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

  • @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
    }
  • @qnikst, минимальный case: bpaste.net