2010-12-15 36 views
43

, bizCurrying çıkarma

map (\x -> x + 1) [1..5] 

yazabilirim ama çoğu insan sadece yerine

map (+1) [1..5] 

için giderdim sanırım. Fakat bu açıkça (-1) ile çalışmaz, çünkü bu olumsuz bir şey.

Yani akla gelen ilk şey çıkarma Prelude (x - y = x + negate y) içinde nasıl tanımlandığını dikkate mantıklıdır hangi

map (+(-1)) [1..5] 

, ama bana biraz tuhaf görünüyor. Sonra ben

map (flip (-) 1) [1..5] 

Bu şekilde bana daha iyi görünüyor, ama belki biraz çok karmaşık geldi.

Şimdi bunun büyük bir şey olmadığını biliyorum, ama bunu yazmanın daha bariz bir yolunu özlüyorum diye merak ediyorum. Eğer değilse, 2 yoldan hangisini tercih edersiniz? Ben sadece soruyorum çünkü sık sık kodunuzu daha idiomatik yapan ve bu yüzden okuması gereken diğer geliştiriciler için hoş olan küçük detaylar.

Çözüm İlk kurşunun gerçekten açık çünkü çoğunlukla cevapları bir çift, benim kişisel favorim

map pred [1..5] 

ardından

map (subtract 1) [1..5] 

olduğunu düşünüyorum aldık Şimdi

ve hiç kimse, pred'un (önceki model) ne anlama geldiğini tahmin etmeye/aramaya ihtiyaç duymaz.

map (subtract 1) [1..5] 
+3

küçük not yazabilir öneririm: sorun operatör bölümü sözdizimi var, currying değildir.'(-) 1', curried' -' işlevini kısmen uygulamak için (sözdizimsel olarak geçerli) bir yoldur. –

+3

Bunun için bir başlık ile mücadele ediyordum ve daha iyi bir şey ile gelemedim. Ayrıca 'harita ((-) 1) [1..5]' çalışmaz, dolayısıyla flip ile sürümü. –

+0

Onlar İntegral ve sadece 1 çıkarmak istiyorsun, neden 'harita pred' –

cevap

38

yerine - ait subtract işlevini kullanabilirsiniz. Ben de okumak için ilk çözüm, map (+(-1)) [1..5], kolay bulabilirsiniz. - yana

+1

Bu, demek istediğim bariz şeydi, teşekkürler! Bazen ağaçların ormanını, Hoogle'u ve hepsini göremezsiniz. –

1

ben hangisinin çıkarılır değerler hakkında hiç şüphe yok çünkü map (\x -> x - 1) [1..5], daha iyi programcı niyetini iletir düşünüyorum: Eğer sağ bölümünde çıkarma istiyorsanız

8

infix çıkarma ve önek negate hem sen (*x) (* olan bir infix operatörü ve bir değer x) kullanan - için sözdizimi olamaz. Neyse ki Prelude, sırasıyla \x -> -x ve \x y -> y-x olan negate ve subtract ile gelir, böylece ikisi arasında ayrım yapmak istediğiniz yerleri kullanabilirsiniz.

+0

'subtract' aslında' \ x y -> y - x' şeklindedir. – nyuszika7h

+0

@ nyuszika7h teşekkürler, çözdüm. – HaskellElephant

2

subtract'u beğenmedim, çünkü geriye doğru karışık. Ben

minus :: Num n => n -> n -> n 
minus = (-) 
infixl 6 `minus` 

Sonra

map (`minus` 1) [1..5] 
+2

Sadece '(+ (- 1))' yi tercih ederim. Yeni isimle hile güzel, ama çok değerli bir isim alır. Çok kötü '' ('-' 1)' 'geçersiz sözdizimi. –