Fonksiyonel Özellikler
İşlevsel programlamayı veya işlevsel bir kitaplığı neyin tanımladığına dair net bir sınır yoktur. İşlevsel dillerin bazı özellikleri Javascript'te yerleşiktir:
- Birinci sınıf, üst düzey işlevler
- Lambdas / Anonim işlevler, kapatmalarla
Diğerlerini Javascript'te biraz dikkatlice başarmak mümkündür:
- Değişmezlik
- İfade Şeffaflığı
Yine de diğerleri ES6'nın bir parçasıdır ve şu anda kısmen veya tamamen mevcuttur:
- Kompakt, hatta kısa, işlevler
- Kuyruk arama optimizasyonu yoluyla performans özyinelemesi
Ve Javascript'in normal erişiminin gerçekten ötesinde olan pek çok başkası var:
- Desen eşleştirme
- Tembel değerlendirme
- Homoikonisite
Bir kütüphane, o halde, desteklemeye çalıştığı özelliklerin türünü seçebilir ve makul bir şekilde "işlevsel" olarak adlandırılabilir.
Fantezi arazi özellikleri
Fantasy-land , matematiksel Kategori Teorisi ve Soyut Cebirden fonksiyonel programlamaya, Monoid , Functor ve Monad gibi türlere taşınan bir dizi standart tür için bir belirtimdir . Bu türler oldukça soyuttur ve muhtemelen daha tanıdık kavramları genişletir. Funktorlar Örneğin, olabilir kaplardır map
bir fonksiyonu bir dizi olabilir şekilde fazla ped map
kullanarak üzerinde ped Array.prototype.map
.
Halk Hikayesi
Folktale , Fantezi arazi şartnamesinin çeşitli kısımlarını ve yardımcı yardımcı program işlevlerinin küçük bir koleksiyonunu uygulayan bir tür koleksiyonudur. Bu türler Belki , Ya , Görev (başka bir yerde bir Gelecek olarak adlandırılana ve bir Sözün daha yasal bir kuzeni olana çok benzer) ve Doğrulama gibi şeylerdir.
Folktale, Fantazi arazi şartnamesinin belki de en iyi bilinen uygulamasıdır ve saygı duyulur. Ancak kesin veya varsayılan uygulama diye bir şey yoktur; fantasy-land yalnızca soyut türleri belirtir ve tabii ki bir uygulama bu tür somut türleri yaratmalıdır. Folktale'in işlevsel bir kütüphane olma iddiası açıktır: tipik olarak işlevsel programlama dillerinde bulunan ve işlevsel bir şekilde programlamayı önemli ölçüde kolaylaştıran veri türlerini sağlar.
Folktale belgelerinden alınan bu örnek ( not : belgelerin son sürümlerinde yoktur), nasıl kullanılabileceğini gösterir:
var Maybe = require('data.maybe')
function find(predicate, xs) {
return xs.reduce(function(result, x) {
return result.orElse(function() {
return predicate(x)? Maybe.Just(x)
: Maybe.Nothing()
})
}, Maybe.Nothing())
}
var numbers = [1, 2, 3, 4, 5]
var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers)
var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers)
Ramda
Ramda (sorumluluk reddi: Ben yazarlardan biriyim) çok farklı bir kitaplık türüdür. Size yeni tipler sağlamaz. 1 Bunun yerine, mevcut türler üzerinde çalışmayı kolaylaştıran işlevler sağlar. Daha küçük işlevleri daha büyük işlevlere dönüştürme, değişmez verilerle çalışma, yan etkilerden kaçınma kavramları üzerine inşa edilmiştir.
Ramda özellikle listeler üzerinde çalışır, aynı zamanda nesneler ve bazen de Dizeler üzerinde çalışır. Ayrıca çağrılarının çoğunu, Folktale veya diğer Fantasy-land uygulamalarıyla birlikte çalışacak şekilde yetkilendirir. Örneğin, Ramda en map
işlevi, üzerindeki birine benzer çalışırken Array.prototype
yüzden R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
. Ancak Folktale, haritayı da belirten Maybe
Fantasy-land Functor
spesifikasyonunu uyguladığından, Ramda'nın özelliklerini de kullanabilirsiniz map
:
R.map(square, Maybe.Just(5));
R.map(square, Maybe.Nothing);
Ramda'nın işlevsel bir kütüphane olma iddiası, işlevler oluşturmayı kolaylaştırmada, verilerinizi asla değiştirmemede ve yalnızca saf işlevler sunmada yatar. Ramda'nın felsefesi üzerine bir makalede görüldüğü gibi, Ramda'nın tipik kullanımı, daha küçük işlevler oluşturarak daha karmaşık işlevler oluşturmak olacaktır.
var userRatingForComments = R.pipe(
R.pluck('username')
R.map(R.propOf(users)),
R.pluck('rating'),
);
Diğer Kitaplıklar
Aslında daha fazla kütüphane buldum, hepsi iki kategoriye ayrılıyor gibi görünüyor. alt çizgi, lodash Ramda'ya çok benziyor. Fantezi diyarı, noktasız fantazi halk masalı gibidir.
Bu gerçekten doğru değil. Her şeyden önce, Fantasy-land, kütüphanelerin çeşitli türler için uygulamaya karar verebilecekleri bir şartnamedir. Folktale, bu spesifikasyonun birçok uygulamasından biridir, muhtemelen en iyi olanı, kesinlikle en olgun olanlardan biridir. Noktasız-fantezi ve ramda-fantezi diğerleridir ve çok daha fazlası vardır .
Alt çizgi ve lodash , Folktale gibi bir şeye göre çok daha az uyum ile çok sayıda işlev sağlayan, kapma-torba kitaplıkları olmaları bakımından yüzeysel olarak Ramda'ya benzerler. Ve hatta belirli işlevler bile genellikle Ramda'nınkilerle örtüşüyor. Ancak daha derin bir düzeyde, Ramda'nın bu kütüphanelerden çok farklı endişeleri var. Ramda'nın en yakın kuzenleri muhtemelen FKit , Fnuc ve Wu.js gibi kütüphanelerdir .
Bilby , hem Ramda tarafından sağlananlar gibi bir dizi araç hem de Fantasy-land ile tutarlı bazı türler sağlayan kendi kategorisinde yer almaktadır. (Bilby'nin yazarı, Fantasy-land'ın da orijinal yazarıdır.)
Çağrınız
İşlevsel yaklaşım ve işlevsel bağlılık derecesi açısından büyük farklılıklar gösterse de, tüm bu kütüphaneler işlevsel olarak adlandırılma hakkına sahiptir.
Bu kütüphanelerden bazıları aslında birlikte iyi çalışıyor. Ramda, Folktale veya diğer Fantasy-land uygulamalarıyla iyi çalışmalıdır. Endişeleri çok az örtüştüğü için, gerçekten çatışmıyorlar, ancak Ramda, birlikte çalışmayı nispeten pürüzsüz hale getirmek için yeterli yapıyor. Bu, seçebileceğiniz diğer kombinasyonların bazıları için muhtemelen daha az doğrudur, ancak ES6'nın daha basit işlev sözdizimi, entegrasyonun bir kısmını da ortadan kaldırabilir.
Kitaplık seçimi ve hatta kullanılacak kitaplık stili , projenize ve tercihlerinize bağlı olacaktır. Kullanılabilir birçok iyi seçenek var ve sayılar artıyor ve çoğu büyük ölçüde gelişiyor. JS'de fonksiyonel programlama yapmanın tam zamanı.
1 Folktale'in yaptığına benzer bir şey yapan bir yan proje, ramda-fantazi var, ama bu çekirdek kütüphanenin bir parçası değil.