2011-01-16 18 views
5

NedenNeden ikisi de (^ 2) xs ve map (2 ^) xs Haskell'de beklendiği gibi çalışıyor?

map (^2) [1..10] 

eser ve ayrıca

map (2^) [1..10] 

çalışır?

Sadece ikisi için değil, yalnızca bunlardan biriyle çalışmasını beklerdim.

Ben haritası [1..10] tüm elemanları üzerinde ilerlerken ve sonra map (^2) [1..10] için

[1^2, 2^2, 3^2, ...] 

yapacağını düşündü. Daha sonra map (2^) [1..10] verildiğinde, bir sintaks hatası veya bir şey vereceğini umuyorum, çünkü daha önce değil, ^'dan sonra numaralara ihtiyaç duyacaktır.

+4

Neden sadece bunlardan biri için çalışmasını bekliyorsunuz? – sepp2k

+1

Luqui'nin cevap vermesini beklediğimden soruyu tamamen anlamadığımı söylemeliyim. [Haskell Raporu] 'nu okuduysanız (http://www.haskell.org/onlinereport/haskell2010/)' (^ 2) 've' (2 ^) 'ifadesinin ne anlama geldiği açıktır. (Daha sonra, yeni bir programlama dili kullanmadan önce tüm dil özelliklerini okudum, bunun garip bir alışkanlık olduğu söylendi…) – ephemient

+0

Bu tuhaf ama harika bir alışkanlık ephemient kadar devam et. – Davorak

cevap

16

Haskell dilbilgisi "operatör bölümleri" olarak adlandırılan böyle bir yapı için özel destek sağlar.

(#$%) = \x y -> x #$% y 
(#$% y) = \x -> x #$% y 
(x #$%) = \y -> x #$% y 

Yani bunun kırmak için bazı matematiksel tutarlılık bekliyoruz ve Haskell Forth gibi minik bir dil olsaydı, ben eğimli olacaktır: Eğer herhangi bir infix operatörü varsa, böyle #$% demek, o zaman aşağıdaki notasyon desteklenmektedir sezgilerinizi kabul etmek. Çalışmasının nedeni temelde "çünkü böyle çalışmayı yazdılar".

(O belirsizliği azaltmak için de eklendi - f + xf iki argüman uygulanan demek, ya da aslında biz eski temsil, nasıl ikincisi anlamına geldiği için + iki argüman uygulanan demek Cevap: kullanarak? () bir operatör bölümü tanıtmak.)

+0

Ah! "Çalışmasının nedeni temelde" çünkü bunu "" gibi çalışmak için yazdılar. neye benziyordu! Her zaman olduğu gibi, kurtarma için luqui! Teşekkürler –

+2

[Haskell Report> İfadeler> Bölümler] 'de tanımlanmış (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5) –

0

(2 ^), bir parametre alan ve çağıran yeni bir işlev oluşturur (2^parametresi). Bu bir dolandırıcılık yöntemidir.

İşte bunun arkasında teorisi ile bir bağlantı: Partial Application(Haskell.org)

+0

, orijinal yazımda tam olarak istediğim şey değil (sanırım çok açık değildi). diğer cevaplara bakın. teşekkürler zaten –

+0

anladım ... soruyu anlamadığım için üzgünüm. –

3

Haskell bu ((2^)f(x) = 2^x gibi f(x) = x^2 olarak (^2)) matematiksel gösterimde yorumlar böylece ^ bir çatı ve çatı operatör olduğunu bilir.

İlgili konular