2015-09-03 13 views
8

nie jestem w stanie wyjaśnić następujące zachowanie:Expression Ocena W Haskell: Mocowanie typu sub-wyrażenia powoduje wyrażenie rodzic być oceniane w różnym stopniu

Prelude> let x = 1 + 2 
Prelude> let y = (x,x) 
Prelude> :sprint y 
Prelude> y = _ 

Teraz kiedy określić typ dla X :

Prelude> let x = 1 + 2 ::Int 
Prelude> let y = (x,x) 
Prelude> :sprint y 
Prelude> y = (_,_) 

Dlaczego specyfikacja typu x wymusza na swoim numerze weak head normal form (WHNF)?

Przypadkowo odkryłem to zachowanie podczas czytania Simon Marlow's Parallel and Concurrent Programming In Haskell.

+1

Zobacz także [sprint dla wartości polimorficznych] (http://stackoverflow.com/q/21518584/791604), choć uważam, że zastanawiające jest to, że konstruktor 'y' jest widoczny tutaj nawet w przypadku monomorficznym, więc może to nie jest duplikat. –

Odpowiedz

10

Oto zgadywanka. W swoim pierwszym przykładzie

x :: Num a => a 

Więc

y :: Num a => (a, a) 

w GHC rdzenia, to y jest funkcja że trwa słownika Num i daje parę. Jeśli miałbyś ocenićy, wtedy GHCi domyślnie go dla Ciebie i zastosować słownik Integer. Ale z tego, co pokazałeś, wydaje się prawdopodobne, że nie stanie się z sprint. Zatem nie masz jeszcze pary; masz funkcję, która ją produkuje.

Kiedy specjalizują się Int, słownik jest stosowany do x, więc masz

x :: Int 
y :: (Int, Int) 

Zamiast funkcji ze słownika, x jest teraz thunk. Teraz nie trzeba stosować słownika do oceny y! y to tylko zastosowanie konstruktora pary do dwóch wskaźników do łomotu x. Zastosowanie konstruktora nie jest liczone jako obliczenie, więc nigdy nie jest opóźnione leniwie.

Powiązane problemy