Skip to content

Instantly share code, notes, and snippets.

module Main where
import Prelude
import Type.Proxy
import Prim.Boolean as Boolean
import Type.Data.Peano as Peano
import Type.Data.Boolean (class If)
import Type.Data.Ordering (class Equals)
import Prim.Ordering (LT)
module Main where
import Prelude
import Type.Proxy
import Type.Data.Peano as Peano
type TypeExpr :: forall k. k -> Type
type TypeExpr a = Proxy a -> Type
test = map ((*) 2) >>> filter ((>) 15) >>> drop 3 >>> map show
src1 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
src2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
res1 = transduce' test src1 :: [String]
res2 = transduce' test src2 :: List String
@xgrommx
xgrommx / TLRecursionSchemes.hs
Last active January 19, 2021 19:06
Type level recursion schemes
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module TLRecursionSchemes where
import qualified GHC.TypeLits as TL

DSl'и и как писать большие программы на PureScript'е

Вступление

Приветы! Меня зовут Максим Зималиев, я работаю в SlamData и уже почти два с половиной года пилю в продакшн код на PureScript'е. Как и большинство пришедших в прекрасный мир ФП, я начинал со всяких там джаваскриптов, пхп и шарпов. Соответственно, у меня есть бывшие коллеги и друзья, которые по-прежнему работают на императивных языках, используют GoF, DDD и тому подобное.

Ну так вот, пойдешь такой пиво пить, и внезапно "Слушай, а как у вас в PureScript'е, например ORM запилить, объектов же нет?" Или: "Это здорово всё, но вот я домены описываю вот так вот, у них там поведение есть, а как это PureScript'е сделать?"

@xgrommx
xgrommx / Rec.hs
Created April 2, 2020 18:18
Recursion schemes from scratch
{-# LANGUAGE RankNTypes, MultiParamTypeClasses, FunctionalDependencies #-}
module Main7 where
sumL :: [Int] -> Int
sumL [] = 0
sumL (x:xs) = x + sumL xs
sumL1 :: [Int] -> Int
sumL1 [] = 0
@xgrommx
xgrommx / X.hs
Last active February 26, 2020 22:10
X
-- X = presheaf ^ profunctor
-- Yoneda = X (->)
newtype X p f a = X { runX :: forall b. p a b -> f b }
hoistX :: forall p f g. (f ~> g) -> (X p f ~> X p g)
hoistX phi (X f) = X (\g -> phi (f g))
withX :: forall w p f a. (Category p, Functor f, Comonad w, Sieve p w) => (X p f a -> X p f a) -> (f a -> f a)
withX phi = lowerX @p @f . phi . liftX @w @p @f
@xgrommx
xgrommx / headt.purs
Last active December 17, 2019 03:08
module HEADT where
import Prelude
import Control.Alternative (class Alt, class Alternative, class Plus, empty, (<|>))
import Control.MonadZero (guard)
import Data.Either (Either(..))
import Data.Eq (class Eq1, eq1)
import Data.Identity (Identity(..))
import Data.Leibniz (type (~), coerceSymm)
import Data.Functor.Day
import Data.Functor.Identity
import Data.Functor.Compose
import Data.Profunctor.Composition
import Data.Profunctor.Yoneda
import Data.Profunctor
import Control.Monad
import Control.Applicative
import qualified Control.Category as C
import qualified Control.Arrow as A
@xgrommx
xgrommx / LensEADT.purs
Created September 10, 2019 14:13
EADT with profunctor lenses and prisms
module Main where
import Prelude
import Control.Lazy (fix)
import Control.MonadZero (guard, (<|>))
import Data.Foldable (oneOfMap)
import Data.Functor.Mu (Mu, roll, unroll)
import Data.Functor.Variant (VariantF)
import Data.Functor.Variant as VF