Mam następujące funkcje zdefiniowane:Dlaczego to stwierdzenie Haskella nie jest leniwie oceniane?
ex 1 x = 1
ex 0 x = 0
ex b x = b ** x
Wtedy, kiedy wykonać następujące czynności:
1 `ex` (sum [1..])
próbuje obliczyć sumę nieskończonej sekwencji, zamiast być leniwy i powrotu 1. Czemu?
EDIT: Po dalszych badaniach, stwierdziliśmy, że lenistwo stanie, jeśli zdefiniować funkcję w pliku ex
, ale jeśli nie mogę zdefiniować ją w GHCI:
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> let ex 1 x = 1
Prelude> let ex b x = b ** x
Prelude> ex 1 (sum [1..])
<interactive>: out of memory (requested 1048576 bytes)
Gdybym ciągnąć definicję ex
do pliku (w tym przypadku test.hs):
$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> :load test.hs
[1 of 1] Compiling Main (test.hs, interpreted)
Ok, modules loaded: Main.
*Main> ex 1 (sum [1..])
1.0
Nowe pytanie brzmi: dlaczego?
Nie, 1 'ex' (suma [1 ..]) zwraca 1.0 na moim komputerze. Jaką wersję ghc itp? Czy otrzymujesz taki sam wynik z ex 1 (suma [1 ..])? – ShreevatsaR
Prawdopodobnie błąd? –
@ShreevatsaR: Dobrze, zobacz moją aktualizację powyżej. – perimosocordiae