2013-08-12 10 views
13

Ho qualche codice HaskellPerché ghc genera così tante espressioni caso nidificate dall'aspetto inutile?

indLoc index way = do 
    Store p <- ask 
    return $ plusPtr p localAddr 
    where localAddr = (stHeader + stIndices + index + stIndices * way) * blockSize 
--snip... 
    (Just way, _) -> do 
     liftIO $ pokeElemOff loc way a 
     indLoc index way 

che sta generando un certo nucleo piuttosto strano-cercando:

case GHC.Prim.writeInt64OffAddr# 
     @ GHC.Prim.RealWorld a4_s4UV i_s4UW x_s4UX new_s_s4UY 
    of s2_s4V0 { __DEFAULT -> 
    let { 
    sat_s528 :: GHC.Ptr.Ptr b_a1UV 
    [LclId] 
    sat_s528 = 
     case r_s4Us `cast` ... of _ { GHC.Ptr.Ptr addr_s4Vb -> 
     case index_s4Um of _ { GHC.Types.I# y_s4Vc -> 
     case ds1_s4Ub of _ { (blk1_s529, offs_s4V8) -> 
     case offs_s4V8 of _ { GHC.Types.I# d_s4Vk -> 
     case GHC.Prim.*# 2 i_s4UW of sat_s4Vf { __DEFAULT -> 
     case GHC.Prim.+# 3 y_s4Vc of sat_s527 { __DEFAULT -> 
     case GHC.Prim.+# sat_s527 sat_s4Vf of sat_s526 { __DEFAULT -> 
     case GHC.Prim.*# sat_s526 4096 of sat_s4Vi { __DEFAULT -> 
     case GHC.Prim.plusAddr# addr_s4Vb sat_s4Vi 
     of sat_s525 { __DEFAULT -> 
     case GHC.Prim.plusAddr# sat_s525 d_s4Vk of sat_s524 { __DEFAULT -> 
     GHC.Ptr.Ptr @ b_a1UV sat_s524 
     } 
     } 
     } 
     } 
     } 
     } 
     } 
     } 
     } 
     } } in 
    (# s2_s4V0, sat_s528 #) 
    } 

Il caso espressioni sembrano no-ops. A cosa servono? Rigore?

risposta

18

La valutazione delle forze di espressione case. L'utilizzo di let genererà invece le chiusure. Nota: GHC Core differisce dal normale Haskell nella semantica di case.

+0

Ciò significa che compila una serie di istruzioni aritmetiche? (Ho provato a leggere la discarica di llvm ed è abbastanza incomprensibile.) – Dan

+0

Sì, è quello che è. – augustss

+0

Forse sarebbe utile aggiungere una sintassi superficiale al core per renderlo più leggibile? Qualcosa come "forza x in ..." che è zucchero sintattico per "caso x di _ -> ..."? Sono consapevole del fatto che il core non è destinato alla lettura da parte degli utenti normali, ma anche gli esperti sono utenti;) –

Problemi correlati