dlaczego folktale i ramda są tak różne?

Uczę się javascript FP czytając książkę DrBoolean .

Szukałem biblioteki programowania funkcyjnego. Znalazłem Ramdę i Folktale. Obie twierdzą, że są biblioteką programowania funkcyjnego.

Ale są tak różne:

  • Ramda wydaje się zawierać funkcje użytkowe do obsługi list: map, reduce, filter i Pure functions: curry, compose. Nie zawiera nic do czynienia z monad, funktor.

  • Folktale nie zawiera jednak żadnego narzędzia do listy ani funkcji. Wydaje się, że implementuje pewne struktury algebraiczne w javascript, takie jak monad: Maybe, Task...

Właściwie znalazłem więcej bibliotek, wszystkie wydają się należeć do dwóch kategorii. podkreślam, lodash są bardzo podobne do Ramdy. Fantasy-land, pointfree-fantasy są jak folktale.

Czy te bardzo różne biblioteki można nazwać funkcjonalnymi , a jeśli tak, to co sprawia, że każda funkcjonalna biblioteka?

Author: Aliaksandr Sushkevich, 2015-10-09

1 answers

Funkcje Funkcjonalne

Nie ma wyraźnej granicy tego, co definiuje Programowanie funkcyjne lub bibliotekę funkcjonalną. Niektóre cechy języków funkcyjnych są wbudowane w Javascript:

  • Pierwsza klasa, funkcje wyższego rzędu
  • Lambda/funkcje anonimowe, z zamknięciami

Inne są możliwe do wykonania w Javascript z pewną ostrożnością:

  • niezmienność
  • Przezroczystość Odniesienia

Jeszcze inni są częścią ES6 i częściowo lub w pełni dostępne w tej chwili:

  • Zwarte, parzyste, funkcje
  • Rekurencja wykonywana poprzez optymalizację wywołania ogonowego

I jest wiele innych, które są naprawdę poza normalnym zasięgiem Javascript:

  • dopasowanie wzorca
  • leniwa ocena
  • Homoikoniczność

Biblioteka może wybrać i wybrać, jakie funkcje stara się obsługiwać i nadal rozsądnie być zwany "funkcjonalnym".

Fantasy-land specification

Fantasy-land jest specyfikacją dla wielu standardowych typów przeniesionych z matematycznej teorii kategorii i algebry abstrakcyjnej do programowania funkcyjnego, typów takich jak Monoid, Functor , I Monad . Te typy są dość abstrakcyjne i rozszerzają prawdopodobnie bardziej znane pojęcia. Funktory, na przykład, są kontenerami, które mogą być mapped over z funkcją, sposób tablicy może być mapped over używając Array.prototype.map.

Folktale

Folktale jest zbiorem typów implementujących różne części specyfikacji Fantasy-land oraz małym zbiorem funkcji użytkowych towarzyszących. Te typy to takie rzeczy jak , może, albo, zadanie (bardzo podobne do tego, co gdzie indziej nazywa się przyszłością i bardziej uzasadnionym krewnym obietnicy) oraz sprawdzenie

Folktale to chyba najbardziej znana implementacja ze specyfikacji Fantasy-land, i jest szanowany. Ale nie ma czegoś takiego jak implementacja definitywna lub domyślna; fantasy-land określa tylko abstrakcyjne typy, a implementacja oczywiście musi tworzyć takie konkretne typy. Twierdzenie Folktale ' a o byciu biblioteką funkcjonalną jest jasne: dostarcza ona typów danych występujących zazwyczaj w funkcyjnych językach programowania, które znacznie ułatwiają programowanie w sposób funkcjonalny.

Ten przykład, z Folktale documentation , pokazuje jak można go używać:

// We load the library by "require"-ing it
var Maybe = require('data.maybe')

// Returns Maybe.Just(x) if some `x` passes the predicate test
// Otherwise returns Maybe.Nothing()
function find(predicate, xs) {
  return xs.reduce(function(result, x) {
    return result.orElse(function() {
      return predicate(x)?    Maybe.Just(x)
      :      /* otherwise */  Maybe.Nothing()
    })
  }, Maybe.Nothing())
}

var numbers = [1, 2, 3, 4, 5]

var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers)
// => Maybe.Just(3)

var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers)
// => Maybe.Nothing

Ramda

Ramda (zastrzeżenie: jestem jednym z autorów) jest zupełnie innym rodzajem biblioteki. Nie zapewnia nowych typów dla Ciebie.1 zamiast tego zapewnia funkcje ułatwiające obsługę istniejących typów. Jest on zbudowany wokół pojęć komponowania mniejszych funkcji w większe, pracy z niezmiennymi danymi, unikania skutków ubocznych.

Ramda działa zwłaszcza na listach, ale także na obiektach, a czasem na łańcuchach. Wiele z nich jest również w taki sposób rozpowszechnianych, że będzie współgrać z realizacjami folklorystycznymi lub innymi realizacjami z krainy fantazji. Na przykład funkcja Ramda map działa podobnie do tej NA Array.prototype, więc R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]. Ale ponieważ Folktale 's Maybe implementuje specyfikację Fantasy-land Functor, która również określa mapę, Możesz również użyć Ramda' s map z nią:

R.map(square, Maybe.Just(5)); //=> Maybe.Just(25);
R.map(square, Maybe.Nothing); //=> Maybe.Nothing

Twierdzenia Ramdy o byciu biblioteką funkcjonalną leżą w łatwe komponowanie funkcji, nigdy mutowanie danych i prezentowanie tylko czystych funkcji. Ramda-Rodzaj Ramdy z rodziny Ramdowatych (Ramdaceae), która powstała w 1995 roku w wyniku przekształcenia Ramdy w Ramdę (Ramda).]}

// :: [Comment] -> [Number]  
var userRatingForComments = R.pipe(
    R.pluck('username')      // [Comment] -> [String]
    R.map(R.propOf(users)),  // [String] -> [User]
    R.pluck('rating'),       // [User] -> [Number]
);

Inne Biblioteki

Właściwie znalazłem więcej bibliotek, wszystkie wydają się należeć do dwóch kategorii. podkreślam, lodash są bardzo podobne do Ramdy. Fantasy-land, pointfree-fantasy są jak folktale.

To nie jest do końca dokładne. Po pierwsze, Fantasy-land jest po prostu specyfikacją, którą biblioteki mogą zdecydować się zaimplementować dla różnych typów. Folktale jest jedną z wielu implementacji tej specyfikacji, prawdopodobnie najlepiej zaokrągloną, z pewnością jedną z najbardziej dojrzałych. Pointfree-fantasy i ramda-fantasy to inne, a jest [107]} o wiele więcej.

Podkreślenie i lodash są powierzchownie jak Ramda w tym, że są to biblioteki typu grab-bag, zapewniające dużą liczbę funkcji o znacznie mniejszej spójności niż coś w rodzaju Folktale. I nawet specyficzna funkcjonalność często pokrywa się z Ramdą. ale na głębszym poziomie, Ramda ma bardzo różne obawy od tych bibliotek. Najbliższymi kuzynami ramdy są prawdopodobnie biblioteki typu FKit, Fnuc i Wu.js .

Bilby jest w swojej kategorii, zapewniając zarówno szereg narzędzi, takich jak te dostarczone przez Ramdę i niektóre typy zgodne z Krainą fantazji. (Autor Bilby jest również oryginalnym autorem Fantasy-land.)

Twój Telefon

Wszystkie te biblioteki mają prawo nazywać się funkcjonalnymi, chociaż różnią się znacznie pod względem funkcjonalnego podejścia i stopnia zaangażowania funkcjonalnego.

Niektóre z tych bibliotek naprawdę dobrze ze sobą współpracują. Ramda powinna dobrze współpracować z Folktale lub innymi implementacjami z krainy fantazji. Ponieważ ich obawy ledwo nakładanie się, naprawdę nie kolidują, ale Ramda robi to na tyle, aby współpraca była relatywnie płynna. Jest to prawdopodobnie mniej prawdziwe w przypadku niektórych innych kombinacji, które możesz wybrać, ale prostsza składnia funkcji ES6 może również odciążyć integrację.

Wybór biblioteki, a nawet styl biblioteki do użycia, będzie zależeć od Twojego projektu i Twoich preferencji. Dostępnych jest wiele dobrych opcji, a ich liczba rośnie, a wiele z nich znacznie się poprawiają. To dobry czas na programowanie funkcyjne w JS.


1Cóż, istnieje projekt poboczny, ramda-fantasy robiący coś podobnego do tego, co robi Folktale, ale nie jest częścią podstawowej biblioteki.

 135
Author: Scott Sauyet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 18:37:34