Skip to content

Instantly share code, notes, and snippets.

View Lev135's full-sized avatar
📚
Studying mathematics

Lev Dvorkin Lev135

📚
Studying mathematics
  • 22:46 (UTC +03:00)
View GitHub Profile
@Lev135
Lev135 / AbstractOptic.hs
Created July 12, 2023 12:56
Abstraction over profunctor optics' kinds
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}
@Lev135
Lev135 / Optics.md
Last active October 7, 2023 10:41
Writing profunctor optics by the same template

Writing profunctor optics by the same template

All of the profunctor optics kind have the same, very simple, pattern:

type AnOptic p s t a b = p a b -> p s t
type Optic c s t a b = forall p. c p => AnOptic p s t a b

type Iso s t a b = Optic Profunctor s t a b
@Lev135
Lev135 / Optics.hs
Created July 12, 2023 09:16
Profunctor optics, obtained by the same template
{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
import Control.Monad
import Data.Bifunctor
type AnOptic p s t a b = p a b -> p s t
Benchmark bench-trans-speed: RUNNING...
benchmarking 1/20 modify/pure/2000
time 1.033 μs (1.022 μs .. 1.052 μs)
0.991 R² (0.981 R² .. 0.997 R²)
mean 1.130 μs (1.084 μs .. 1.207 μs)
std dev 182.7 ns (129.1 ns .. 265.3 ns)
variance introduced by outliers: 95% (severely inflated)
benchmarking 1/20 modify/ParserT State/2000
time 1.250 μs (1.236 μs .. 1.264 μs)
@Lev135
Lev135 / monadic-lens.md
Created June 10, 2023 22:39
Monadic variants of optics from Haskell lens library

Monadic lens

So much has been written about lens and other optics in Haskell that these ideas are likely not very original. However, I'll try.

Initial problem

Let's say we have some recursive data type:

type Record = Map String Value
data Value = I Int | R Record
  deriving (Generic, Show)
@Lev135
Lev135 / LensM.hs
Last active June 10, 2023 00:12
Monadic lens in Van Laarhoven representation
{-# LANGUAGE RankNTypes #-}
module LensM where
import Control.Applicative (Const(..))
import Data.Functor.Identity (Identity(..))
import Data.Functor.Contravariant (Contravariant)
import Data.Functor.Compose
class Functor f => MfaAms f where
@Lev135
Lev135 / MLens.hs
Created June 9, 2023 12:24
Effectful composible lens
import Control.Monad ((>=>))
import Data.Map (Map)
import qualified Data.Map as M
import GHC.Generics (Generic)
import Optics
data MLens m s a = MLens
{ mview :: s -> m a
, mset :: a -> s -> m s
}
@Lev135
Lev135 / Main.hs
Last active June 4, 2023 21:07
Call by name?
module Main where
import Data.Maybe (fromJust)
data Expr
= Var String
| Lam String Expr
| App Expr Expr
| Lit Int
| Prim PrimOp Expr Expr
| Let (String, Expr) Expr
@Lev135
Lev135 / Main.hs
Last active June 4, 2023 20:14
Eval by need (with named varriables)
module Main where
import Data.Either.Extra (maybeToEither)
data Expr
= Var String
| Lam String Expr
| App Expr Expr
| Lit Int
| Prim PrimOp Expr Expr
@Lev135
Lev135 / Calc.hs
Created October 31, 2022 19:42
Wrapper for evaluation, that can be reordered for efficiency
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TupleSections #-}
module Calc (
Calc, call, runCalc, runCalcM, extractCalls,
runCalcSortBy, runCalcSortOn, runCalcSort,
contramapRes, mapInit, traverseInit
) where