2010-05-14 17 views
14

Haskell'de basit bir ortalama fonksiyon geliştirmeye çalışıyorum. Bu iş gibi görünüyor:Haskell dot operatörü

lst = [1, 3] 

x = fromIntegral (sum lst) 
y = fromIntegral(length lst) 

z = x/y 

Ama neden aşağıdaki sürüm işi yok ki?

lst = [1, 3] 

x = fromIntegral.sum lst 
y = fromIntegral.length lst 

z = x/y 
+1

Ve ortalama hesaplanarak yaptığınızdan, http://stackoverflow.com/questions/2376981/haskell-types-frustrating-a-simple-average-function/2380437 okuyun: tip hepsini diyor # 2380437. – kennytm

cevap

16

Operatörlere haskell'in öncelik kurallarına göre kafa karıştırıcı olan taksitlere takılıyorsunuz.

Eğer

x = fromIntegral.sum lst 

Haskell görür yazarken aynı şekilde: Yazmak ne kast

x = fromIntegral.(sum lst) 

oldu:

x = (fromIntegral.sum) lst 
+8

Bu doğru. Ancak, yazarların etraflarında boşluk olmadan yazı yazmanın bazen yanlış anlaşılmaya yol açtığını düşünüyorum (yani, birçok OOP merkezli dilde üye erişiminin inşasına benziyor). '(Iligral. toplamı)' soruna neden olabilir, fakat yanlış yorumlama yapamaz. – ony

+1

Dürüst olmak gerekirse, burada kafa karıştırıcı olan şey, Haskell'in kendi içinde öncelikli kurallar değildir (ki bunlar kolay bir şekilde ifade edilir), fakat her biri kendi önceliği olan, başlangıçta tanımlanmış olan, (başlangıç ​​seviyesine kadar) şaşkın operatör dizileridir. – sigfpe

17

. (bileşim) bu yüzden

fromIntegral.sum lst 

sum lst bir fonksiyonu değildir çünkü yanlış

fromIntegral . (sum lst) 

olarak yorumlanır, işlevi uygulama daha düşük önceliğe sahiptir.

10

Ben sadece "eklemek istedim kurtarma için $! ":

x = fromIntegral $ sum lst 
y = fromIntegral $ length lst 

En düşük önceliğe sahiptir ve çok fazla parantez düzeyinden kaçınmak için vardır. (.) 'Dan farklı olarak, işlev kompozisyonu yapmaz, argümanı sağa doğru değerlendirir ve soldaki işleve iletir.

($) :: (a -> b) -> a -> b 
(.) :: (b -> c) -> (a -> b) -> a -> c 
+1

Ve ayrıca x = fromIntegral yazabilirsiniz. OP'nin ilk başta denediği şeye daha yakın olan $ lst'. – yatima2975

+0

Bu argümanı sağa doğru değerlendirdiğini söylemek kesinlikle doğru değil. Değerlendirme hala tembeldir. Argümeni değerlendirmek için, yerine '$!' Istersiniz. – Chuck

+0

Bu çözüm işe yarıyor olsa da, bunun doğru cevap olduğunu düşünmüyorum. Bana göre OP operatör önceliği konusunda kafa karıştırıyor. Ardından cevap, uygun önceliği belirtmek ve parantezlerin burada yardımcı olduğuna işaret etmektir. Henüz başka bir operatör tanıtmak için değil. – Martijn