2012-03-15 19 views
16

Kalıp eşleşmelerine uymadıklarını biliyorum (yani, her bir desen için 'nerede' yan tümcesini yeniden yazmanız gerekir), ancak kapsam belirleme görevlileri nasıl çalışır?Haskell'de, gardiyanlarla uğraşırken bir cümlenin kapsamı nedir?

örn. Bu çalışıyor mu?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
    | x1 < x2 = addOne x2 
    | otherwise = x1 
     where addOne = (1+) 

Yoksa bu mu?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
     where addOne = (1+) 
    | x1 < x2 = addOne x2 
     where addOne = (1+) 
    | otherwise = x1 

cevap

16

İlki doğru olanıdır. Ben haskell wiki üzerinde let vs where sayfasına bir göz atmanızı öneririm, bu iyi bir okumadır (ve ayrıca kapsam belirleme ile nasıl başa çıkılacağını da açıklar). Sadece bir not olarak, aynı tanımları tekrar etmemelisiniz ... kodunuzun başka bir şekilde yapılandırılması gerektiğine dair bir işarettir.

5

where maddesinin kapsamı tüm denklemdir, bu nedenle ilk örneğiniz çalışır.