2014-10-02 18 views
16

starałem się dowiedzieć, jak działają mVars, i natknąłem się na ten kawałek kodu:Jakie hashe (#) są używane w źródle biblioteki?

-- |Create an 'MVar' which is initially empty. 
newEmptyMVar :: IO (MVar a) 
newEmptyMVar = IO $ \ s# -> 
    case newMVar# s# of 
     (# s2#, svar# #) -> (# s2#, MVar svar# #) 

Poza tym jest łudząco wzajemnie rekurencyjne z newMVar, to również usiane hashs (#).

Pomiędzy tymi dwoma, nie wiem, jak to działa. Wiem, że jest to po prostu pseudo-konstruktor dla mVar, ale reszta modułu (w rzeczywistości większość biblioteki) zawiera je i nie mogę znaleźć niczego na nich. Googling "Hashell hashs" nie przyniósł niczego istotnego.

Odpowiedz

18

Są to (dosłownie) magiczne skróty. Wyróżniają one prymitywy GHC, takie jak addycja, typy unboxed i unboxed tuples. Można włączyć pisanie je

{-# LANGUAGE MagicHash #-} 

Teraz można import na odcinki, które pozwoli Ci korzystać z nich

import GHC.Exts 

unboxed :: Int# -> Int# -> Int# 
unboxed a# b# = a# +# b# 

boxed :: Int -> Int -> Int 
boxed (I# a#) (I# b#) = I# (unboxed a# b#) 

To rzeczywiście jest trochę ładne, gdy myślisz o tym, owijając magiczne i surowe prymitywów w ten sposób możemy obsłużyć leniwy Int s i Char s jednolicie na poziomie systemu runtime.

Ponieważ prymitywy nie są zapakowane w pudełka, są segregowane na poziomie jakości. Oznacza to, że nie ma Int# rodzaju * jak normalnych typów, co oznacza również coś podobnego

kindClash :: Int# -> Int# 
kindClash = id -- id expects boxed types 

nie skompiluje.

Aby dokładniej rozwinąć kod, newMVar zawiera wywołanie do prymitywu kompilatora w GHC, aby przydzielić nową zmienną zmienną. To nie jest rekurencyjne tak bardzo jak cienkie opakowanie na wywołanie kompilatora. W rogach tej funkcji gromadzi się także ciemność, ponieważ traktujemy IO jako perwersyjną monadę państwową, ale nie patrzmy uważnie na to. Za bardzo lubię moje zdrowie psychiczne.

Nie używam prymitywów w codziennym kodzie, ani nie powinieneś. Pojawiają się przy wdrażaniu szalonych zoptymalizowanych hotspotów lub w pobliżu prymitywnych abstrakcji, takich jak to, na co patrzysz.

+0

Dziękuję. Tak więc dla moich celów w rozumieniu fragmentów bibliotecznych, mogę zasadniczo zignorować je i po prostu pomyśleć o typach, z którymi są kojarzeni? – Carcigenicate

+1

@Carcigenicate Prawie tak, tak. – bheklilr

+0

@Carcigenicate Powiedziałbym tak, możesz przeczytać dokumentację dla prymitywów, jeśli jesteś naprawdę ciekawy, nie sądzę jednak, abyś zdobył z nich tonę. – jozefg

Powiązane problemy