Sto leggendo su valutazioni pigre in haskell e ho una domanda. Per esempio abbiamo seguenti calcoli:Valutazioni pigre delle strutture dati
Prelude> let x = 1 + 1 :: Int
Prelude> let y = (x,x)
E dopo aver ottenuto il valore di x
:
Prelude> :sprint x
x = _
E 'non valutata. Ok, ora veniamo valore di y:
Prelude> :sprint y
y = (_,_)
E 'non valutata troppo, perché y
dipende x and it's unevaluated
. Ora proviamo lo stesso esempio, ma senza ::Int
:
Prelude> let x = 1 + 1
Prelude> let y = (x, x)
Prelude> :sprint y
y = _
Perché y
valore è _
invece (_, _)
quando stiamo cercando senza ::Int
?
vedo che hanno diversi tipi:
Prelude> let x = 1 + 1
Prelude> :t x
x :: Num a => a
Prelude> let x = 1 + 1 :: Int
Prelude> :t x
x :: Int
Ma perché i valori di y
dipende da esso?
Grazie.
Ora per la parte davvero divertente, con 'x' che ha tipo' Num a => a', cosa succede dopo aver valutato completamente sia 'x' che' y'? Cosa succede alla loro rappresentazione ': sprint'? – bheklilr
@bheklilr, sì, molto interessante. Ho fatto: 'seq' per' x' e 'y', essi stampano valori, ma: stampe sprint' _' – 0xAX
Che cosa significa anche "valutare" 'x' quando il suo tipo è' Num a => a' ? Come fa il compilatore a sapere cosa fare con esso? Come è in grado di dire che il valore di 'x' è' 2' quando non sa quale implementazione di '+' usare? Potrei implementare il mio newtype attorno a 'Int' che ha' + 'definito come' (MyInt x) + (MyInt y) = MyInt (x - y) ', quindi cosa sta facendo GHC qui per poter stampare quel' x 'ha valore' 2'? – bheklilr