2009-11-22 18 views
16

Son zamanlarda beni rahatsız eden hızlı bir soru. Haskell, tüm eşdeğerlik testini, bir false değeri döndürse bile, bir boole döndüren bir işlevde mi çalışır? Haskell'de kısa devre (&&)

f a b = ((a+b) == 2) && ((a*b) == 2) 

ilk test yanlış dönerse Örneğin

için

, bu && sonra ikinci bir test gerçekleştireceğiz? Yoksa Haskell bunu yapmamak ve harekete geçmek için yeterince tembel mi?

cevap

18

Diğer diller gibi kısa devre yaptırılmalıdır. Bu Prelude böyle tanımladı: İlk parametre False ise

(&&)     :: Bool -> Bool -> Bool 
True && x    = x 
False && _    = False 

Yani 2 değerlendirilmesi gerekiyor asla.

+0

Bu, liste kavraması durumunda da aynı mıdır? –

+0

'Kısa devre 'doğru şekilde konuşulmuyor. Değerlerin değerlendirilip değerlendirilmediğini bilemezsiniz, çünkü bunu yan etkileri olmadan kanıtlamak için bir yolunuz yoktur, ancak ihtiyaç duyulmadıkça, bunların mümkün olmayacaktır. – Dario

+0

Sanırım C++ ile aynı: Dil sağ tarafın değerlendirilmediğini söylüyor. Ancak, eğer derleyici herhangi bir yan etki olmadığını söylerse, bunu zaten değerlendirebilir - ve bazı C++ derleyicileri şartlı dallar pahalı olduğu için bunu yapar. –

1

Tembel değerlendirme, gerçekten gerekli olana kadar hiçbir şeyin değerlendirilmediği anlamına gelir.

5

Martin'in dediği gibi, tembel değerlendirmeyle ilgili diller, hiçbir zaman değeri olmayan bir şeyi hiçbir zaman değerlendirmeye gerek duymaz. Haskell gibi tembel bir dilde, özgürce donduruyorsunuz. Çoğu dilde || ve & & ve benzer operatörler kısa devre değerlendirmesi yapabilmeleri için dile özel olarak oluşturulmalıdır. Ancak, Haskell'de, tembel değerlendirme bunu gereksiz kılmaktadır.

scircuit fb sb = if fb then fb else sb

Bu fonksiyon sadece mantıksal 'veya' operatörü gibi davranacaktır: Sen kısa devreler bile kendinizi bir işlev tanımlayabiliriz. İşte nasıl || Haskell:

Bu nedenle, sorunuza özel cevabı vermek için tanımlanmıştır. Eğer || doğru, sağ taraf asla değerlendirilmez. Diğer operatörler için “kısa devre” diye iki ve ikiyi bir araya getirebilirsiniz.