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.
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
@Carcigenicate Prawie tak, tak. – bheklilr
@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