2012-03-04 10 views
21

değerlendirmek belgelerin bir özütü:"değerlendirmek" Burada işlev

evaluate x 

return $! x 

aynı değildir (http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Control-Exception-Base.html#v:evaluate bakınız) doğru bir tanımı

evaluate x = (return $! x) >>= return 
olduğu

Bu iki tanım arasındaki anlam farkını anlamıyorum ... Bana yardımcı olabilecek biri var mı? Şimdiden teşekkürler!

+4

Bu aslında monad yasalarını ihlal etmiyor mu? – leftaroundabout

+2

@leftaroundabout Hayır, öyle değil. Her ikisi de eğer koşarsa tam olarak aynı şekilde davranır, ama ifadeleri “seçerseniz,” geri dönüşü verir! x' bir 'seq' dışına sahiptir, '(return $! x) >> = return' bir' (>> =) 'dışa doğrudur. –

+4

@leftaroundabout: Hayır, çünkü yasalar bakımından ⊥ dikkate alınmaz. Reader gibi standart monadlar da aynı şekilde davranır. (Daniel Fischer'ın argümanını (diğerlerinden daha önce duyduğum) satın almıyorum, çünkü "eğer koşarsa tam olarak aynı davranın" gerçekten iyi tanımlanmış bir kavram değildir.) – ehird

cevap

19

Hızlı ref:

evaluate türüdür:

evaluate :: a -> IO a 

seq tip a -> b -> b sahiptir. İlk önce ilk argümanı değerlendirir, ardından ikinci argümanı döndürür. return $! x ve (return $! x) >>= return arasındaki fark şu ifadeyle belirginleşir

evaluate x `seq` y ==> y 
evaluate x `catch` f ==> (return $! x) `catch` f 
evaluate x >>= f  ==> (return $! x) >>= f 

:

evaluate undefined `seq` 42 

ilk kural olarak, bu 42'ye değerlendirmek gerekir

değerlendirin

bu üç kurallara uyar

iletanımında, yukarıdaki ifade tanımlanmamış bir istisna neden olur. Bu IO değeri hesaplanır zaman 42.

Temel olarak, return $! x bir şekilde sıkı eşit yapar (return $! x) >>= return tanımı ile eşit 42.

değil değeri ⊥ sahiptir. Diğer form sadece IO değeri çalıştırıldığında ve kullanılan değer (>>= kullanarak) katıdır. Daha fazla ayrıntı için bkz. this mailing list thread.

+0

Neden (dönüş $! Undefined) >> = dönüş 'dönüş' dönüşünden farklıdır! undefined'?Benim tahminim, 'undefined'in '(($' undefined $ dönüşü olmayan) >> geri dönüşü \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – mucaho