- Absolution Gap - Alastair Reynolds
- Abundance - Peter H Diamandis
- Advances in Active Portfolio Management - Richard Grinold
- Advances in Unconventional Computing - Andrew Adamatzky
- Creating Modern Capitalism - Thomas Mccraw
- Exhalation - Ted Chiang
- From Bacteria to Bach and Back - Daniel C. Dennett
- Human Compatible - Russell Stuart
- Look To Windward - Iain M. Banks
- Lost in Math - Sabine Hossenfelder
#!/usr/bin/env bash | |
# forked from Moritz Angerman https://github.com/angerman/haskell-to-web/blob/master/ghcjs-build-notes.org | |
set -e pipefail | |
cabal new-install happy --overwrite-policy=always | |
cabal new-install alex --overwrite-policy=always | |
cabal new-install hscolour --overwrite-policy=always | |
cabal new-install hsc2hs --overwrite-policy=always |
Приветы! Меня зовут Максим Зималиев, я работаю в SlamData и уже почти два с половиной года пилю в продакшн код на PureScript'е. Как и большинство пришедших в прекрасный мир ФП, я начинал со всяких там джаваскриптов, пхп и шарпов. Соответственно, у меня есть бывшие коллеги и друзья, которые по-прежнему работают на императивных языках, используют GoF, DDD и тому подобное.
Ну так вот, пойдешь такой пиво пить, и внезапно "Слушай, а как у вас в PureScript'е, например ORM запилить, объектов же нет?" Или: "Это здорово всё, но вот я домены описываю вот так вот, у них там поведение есть, а как это PureScript'е сделать?"
{-# LANGUAGE ForeignFunctionInterface #-} | |
{-# LANGUAGE JavaScriptFFI #-} | |
{-# LANGUAGE UnliftedFFITypes #-} | |
{-# LANGUAGE GHCForeignImportPrim #-} | |
{-# LANGUAGE TypeSynonymInstances #-} | |
{-# LANGUAGE FlexibleInstances #-} | |
{-# LANGUAGE DataKinds #-} | |
{-# LANGUAGE PolyKinds #-} | |
{-# LANGUAGE DeriveDataTypeable #-} | |
{-# LANGUAGE TypeFamilies #-} |
Декларативность. Лаконичный и оптимизируемый код | |
Разделение кода сложных состояний на 3 части позволяет сильно уменьшить сложность | |
и объем кода (за счёт автоматизации кода, актуализирующего эти состояния, | |
при изменении других состояний), а также реализовывать оптимизации на системном уровне. | |
1) Декларативное описание того как используется результат (зачем вы что-то делаете, целеполагание) | |
2) Декларативное описание от каких состояний зависит результат (что нужно чтобы выполнить задачу) | |
3) Способ вычисления результата (как распорядится ингридиентами, чтобы получить необходимое) |
module RxPlayground where | |
import Debug.Trace (trace, print) | |
import Control.Monad.Eff | |
import Data.Array ((..)) | |
foreign import data Observable :: * -> * | |
foreign import data Subject :: * -> * | |
foreign import data Observer :: * -> * |
(require '[clojure.core.async :as a]) | |
(def xform (comp (map inc) | |
(filter even?) | |
(dedupe) | |
(flatmap range) | |
(partition-all 3) | |
(partition-by #(< (apply + %) 7)) | |
(flatmap flatten) | |
(random-sample 1.0) |
There are lots of representations for strings. In most languages they pick one set of tradeoffs and run with it. In haskell the "default" implementation (at least the one in the prelude) is a pretty bad choice, but unlike most other languages (really) good implementations exist for pretty much every way you can twist these things. This can be a good thing, but it also leads to confusion, and frustration to find the right types and how to convert them.