Köriyi kullanmak için parametre sıralaması


93

Hack'lerin olduğu flipveya \x -> foo bar x 42olduğu yerde çok fazla kod olduğundan, parametrelerin sırasını değiştirmek için yakın zamanda iki kez yeniden düzenlenmiş kodum var .

Bir fonksiyon imzası tasarlarken hangi prensipler körlemeden en iyi şekilde faydalanmam için bana yardımcı olur?

Yanıtlar:


111

Körili ve kısmi uygulamayı kolayca destekleyen diller için, orijinal olarak Chris Okasaki'den gelen bir dizi zorlayıcı argüman vardır:

  • Veri yapısını son bağımsız değişken olarak koyun

Neden? Daha sonra veriler üzerinde güzel bir şekilde işlemler oluşturabilirsiniz . Örn insert 1 $ insert 2 $ insert 3 $ s. Bu durumdaki işlevler için de yardımcı olur .

"Kaplar" gibi standart kitaplıklar bu kuralı izler .

Bazen veri yapısını ilk sıraya koymak için alternatif argümanlar verilir, böylece kapatılabilir ve statik bir yapı üzerinde (örneğin arama) biraz daha özlü fonksiyonlar elde edilebilir. Bununla birlikte, geniş fikir birliği, özellikle sizi ağır bir şekilde parantez içine alınmış koda doğru ittiği için, bunun daha az bir kazanç olduğu yönünde görünüyor.

  • En değişken argümanı en sona koyun

Özyinelemeli fonksiyonlar için, en çok değişen argümanı (örneğin bir biriktirici) son argüman olarak, en az değişen argümanı (örneğin bir fonksiyon argümanı) başlangıçta koymak yaygındır. Bu, son stil veri yapısı ile iyi bir uyum sağlar.


Okasaki görünümünün bir özeti Edison kütüphanesinde verilmiştir (yine başka bir veri yapısı kütüphanesi):

  • Kısmi uygulama : Statik olma olasılığı daha yüksek olan argümanlar, kısmi uygulamayı kolaylaştırmak için genellikle diğer argümanlardan önce görünür.
  • Koleksiyon en son görünür : Bir işlemin tek bir koleksiyonu sorguladığı veya mevcut bir koleksiyonu değiştirdiği tüm durumlarda, koleksiyon argümanı en son görünür. Bu, Haskell veri yapısı kitaplıkları için fiili bir standarttır ve API'ye bir derece tutarlılık kazandırır.
  • En genel sıra : Bir işlemin birden fazla veri yapısında iyi bilinen bir matematiksel işlevi temsil ettiği durumlarda, bağımsız değişkenler, işlev için en genel bağımsız değişken sırasına uyacak şekilde seçilir.

İlk madde işaretinin doğal sonucu olarak, bir veri yapısında yaşayabilecek argümanı da son olarak koyun. Haritayı, katlamayı ve arkadaşları daha temiz hale getirir. tl; dr listedeki şey son gider.
John F. Miller

1
Arama zaten zincirlenemez, bu nedenle ilk nokta bunu bir kenara bırakmaz. haskell.org/haskellwiki/Parameter_order , tam tersi bir ikna edici argüman yapar - "Map türündeki nesneler eşlemeleri temsil ettiğinden, bir Map nesnesini temsil edilen işleve dönüştüren bir işleve sahip olmak doğaldır."
Brandon

11

İlk önce yeniden kullanma olasılığınızın en yüksek olduğu argümanları yerleştirin. Fonksiyon argümanları bunun harika bir örneğidir. map fAynı liste üzerinde birçok farklı işlevi eşleştirmek istemekten çok, iki farklı listeyi istemeniz çok daha olasıdır .


5
Aslında aynı liste üzerinde birçok işlevi eşliyorsanız, belki bir işlev listesi yapmalı ve map ($myList)bunun yerine bu listenin üzerine gitmelisiniz.
Squidly

3

Yaptığınız şeyi yapma eğilimindeyim, iyi görünen bir düzen seçin ve başka bir siparişin daha iyi olduğu ortaya çıkarsa yeniden düzenleme yapın. Sıra, işlevi nasıl kullanacağınıza (doğal olarak) bağlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.