W prostych słowach wartość typu Int
może być wyrażeniem niedoszacowanym. Faktyczna wartość nie jest obliczana, dopóki "nie spojrzysz" na wartość.
Wartość typu Int#
jest ocenianym wynikiem. Zawsze.
W wyniku tego, Int
struktura danych, która żyje na stercie. Numer Int#
to ... 32-bitowa liczba całkowita. Może żyć w rejestrze procesora. Możesz operować na nim za pomocą pojedynczej instrukcji maszyny. Nie ma prawie żadnych kosztów ogólnych.
Natomiast, kiedy piszesz, powiedzmy, x + 1
, nie jesteś rzeczywiście computing x + 1, jesteś tworząc strukturę danych na stercie, który mówi „, gdy chcemy obliczyć to zrobić x + 1 ".
Krótko mówiąc, Int#
jest szybszy, ponieważ nie może być leniwy.
Kiedy należy go używać? Prawie nigdy. To jest praca kompilatora. Pomysł polega na tym, że piszesz ładny wysokopoziomowy kod Haskella z udziałem Int
i , kompilator wymienia gdzie może zastąpić Int
z Int#
. (Mamy nadzieję!) Jeśli tak nie jest, prawie zawsze łatwiej jest rzucić kilka adnotacji o ścisłości, niż grać bezpośrednio z Int#
. (Jest także nieprzenośny, tylko GHC używa Int#
- chociaż obecnie nie ma żadnych innych powszechnie używanych kompilatorów Haskell.)
Napisałem [artykuł] (http://alpmestan.com/posts/2013 -10-02-oh-my-laziness.html) o tym, możesz chcieć dać mu szansę. –