it-swarm-eu.dev

Jak navrhujete programy v Haskellu nebo jiných funkčních programovacích jazycích?

Mám zkušenosti s objektově orientovanými programovacími jazyky jako c # nebo Ruby. Vím, jak navrhnout program v objektově orientovaném stylu, jak vytvářet třídy a objekty a jak definovat vztahy mezi nimi. Znám také některé vzory.

Jak lidé píšou funkční programy? Jak začínají? Existují vzory pro funkční jazyky? Jsou metodiky jako extrémní programování nebo agilní vývoj použitelné pro funkční jazyky?

52
Luke

Svoji odpověď píšu hlavně s ohledem na Haskell, ačkoli mnoho konceptů platí stejně dobře pro další funkční jazyky, jako jsou Erlang, LISP a ML. Někteří dokonce platí (do určité míry) na Ruby, Python, Perl a Javascript.

Jak lidé píšou funkční programy? Jak začínají?

Psaním funkcí. Při provádění funkčního programování píšete main, nebo píšete pomocnou funkci. Vaším hlavním cílem může být někdy napsat datový typ s různými relevantními funkcemi, které s ním pracují.

Funkční programování je velmi vhodné pro přístupy shora dolů i zdola nahoru. Haskell důrazně doporučuje psaní programů v jazyce na vysoké úrovni a pak jednoduše definování podrobností vašeho návrhu na vysoké úrovni. Viz například minimum:

minimum    :: (Ord a) => [a] -> a
minimum xs =  foldl1 min xs

Funkce k nalezení nejmenšího prvku v seznamu je psána jednoduše jako průnik nad seznamem, pomocí funkce min porovnává každý prvek s "akumulátorem" nebo aktuální minimální hodnotou.

Existují vzory pro funkční jazyky?

Existují dvě věci, které lze přirovnat k „návrhovým vzorům“, imho, funkce vyššího řád a monad. Pojďme mluvit o bývalém. Funkce vyššího řádu jsou funkce, které buď berou jiné funkce jako vstup, nebo produkují funkce jako výstup. Jakýkoli funkční jazyk obecně intenzivně používá map, filter a fold (fold se často také nazývá "redukovat"): tři velmi základní funkce vyššího řádu, které používají fungovat do seznamu různými způsoby. Tito nahrazují kotlovou desku pro smyčky krásným způsobem. Předávání funkcí jako parametrů je extrémně výkonným přínosem pro programování; Mnoho „návrhových vzorů“ lze dosáhnout jednodušší pomocí funkcí vyššího řádu, tím, že si budete moci vytvořit svůj vlastní, a využít výkonné standardní knihovny, která je plná užitečných funkcí.

Monády jsou „děsivějším“ tématem. Ale nejsou tak strašidelní. Můj oblíbený způsob, jak myslet na monády, je myslet na ně jako na obalení funkce v bublině a dávat této funkci supervelmoci (které fungují pouze uvnitř bubliny). Mohl bych to propracovat, ale svět opravdu nepotřebuje další monad analogii. Takže přejdu k rychlým příkladům. Předpokládejme, že chci použít nedeterministický „návrhový vzor“. Chci spustit stejný výpočet pro různé různé vstupy současně. Nechci si vybrat jen jeden vstup, chci je vybrat všechny. To by byl seznam monad:

allPlus2 :: [Int] -> [Int]
allPlus2 xs = do x <- xs
                 return (x + 2)

Nyní je idiomatický způsob, jak to provést, skutečně map, ale pro ilustraci vidíte, jak mi seznam monad dovolil napsat funkci, která vypadá, jako by fungovala na jedné hodnotě, ale vybavila ji supervelmocí pracovat na každém prvku v seznamu? Mezi další supervelmoc patří selhání, stav, interakce s „vnějším světem“ a paralelní provádění. Tyto supervelmoci jsou velmi silné a většina programovacích jazyků umožňuje, aby funkce s velmocemi zuřily všude kolem. Většina lidí říká, že Haskell tyto supervelmoci vůbec nedovoluje, ale ve skutečnosti je Haskell jen obsahuje v monadech, takže jejich účinek lze omezit a pozorovat.

tl; dr Grokking vyšších řádových funkcí a monád je Haskell ekvivalentem s designem šikmých návrhů. Jakmile se naučíte tyto koncepty Haskell, začnete uvažovat, že „návrhové vzory“ jsou většinou levná zástupná řešení, která simulují sílu Haskell.

Jsou metodiky jako extrémní programování nebo agilní vývoj použitelné pro funkční jazyky?

Nevidím nic, co by tyto strategie řízení spojovalo s jedním paradigmatem programování. Jak phynfo řekl, funkční programování prakticky síly vy musíte provést rozklad funkce, rozdělit velký problém na subproblems, tak mini-milníky by měly být kousek koláče. Existují nástroje jako QuickCheck a Zeno, které otestují nebo dokonce prokáží vlastnosti funkcí, které píšete.

24
Dan Burton