Wszyscy wiemy (lub powinniśmy wiedzieć), że Haskell jest domyślnie leniwy. Nic nie jest oceniane, dopóki nie musi zostać ocenione. Kiedy więc trzeba coś ocenić? Są punkty, w których Haskell musi być surowy. Nazywam te „punktami ścisłości”, chociaż ten konkretny termin nie jest tak rozpowszechniony, jak myślałem. Jeśli chodzi o mnie:
Redukcja (lub ocena) w Haskell występuje tylko w punktach ścisłości.
A więc pytanie brzmi: czym dokładnie są punkty ścisłości Haskella? Moja intuicja mówi, że main
, seq
/ wzory bang, pasujące do wzorca, a także wszelkie IO
działania wykonywane poprzez main
to główne punkty surowość, ale ja naprawdę nie wiem dlaczego ja o tym wiedzieć.
(Jeśli nie są nazywane „punktami ścisłości”, jak się je nazywa?)
Wyobrażam sobie, że dobra odpowiedź będzie obejmować dyskusję na temat WHNF i tak dalej. Wyobrażam sobie również, że może to dotyczyć rachunku lambda.
Edycja: dodatkowe przemyślenia na temat tego pytania.
Kiedy zastanawiałem się nad tym pytaniem, myślę, że byłoby jaśniejsze dodanie czegoś do definicji punktu ścisłości. Punkty ścisłości mogą mieć różne konteksty i różną głębokość (lub rygorystyczność). Wracając do mojej definicji, że „redukcja Haskella występuje tylko w punktach ścisłości”, dodajmy do tej definicji następującą klauzulę: „punkt ścisłości jest wyzwalany tylko wtedy, gdy otaczający go kontekst jest oceniany lub redukowany”.
Pozwól, że spróbuję zacząć od odpowiedzi, jakiej chcę. main
jest punktem ścisłości. Jest specjalnie wyznaczony jako główny punkt ścisłości swojego kontekstu: program. Kiedy program ( main
kontekst) jest oceniany, uaktywniany jest punkt ścisłości main. Głębokość maina jest maksymalna: musi być w pełni oceniona. Main zwykle składa się z działań IO, które są również punktami ścisłości, których kontekst jest main
.
Teraz spróbuj: omówić seq
i dopasować wzorce w tych terminach. Wyjaśnij niuanse stosowania funkcji: jak to jest ścisłe? Jak to nie jest? O co chodzi deepseq
? let
i case
oświadczenia? unsafePerformIO
? Debug.Trace
? Definicje najwyższego poziomu? Ścisłe typy danych? Wzory Bang? Itd. Ile z tych pozycji można opisać za pomocą samego dopasowania sekwencji lub wzorca?
seq
i dopasowanie wzorców jest wystarczające, a reszta jest zdefiniowana w tych kategoriach. Myślę, że dopasowanie wzorców zapewniaIO
na przykład ścisłość kręgosłupa działań.