Skip to content

Instantly share code, notes, and snippets.

@chrisdone
chrisdone / 0README.md
Last active March 22, 2024 12:41
Various type inference designs/sketches

Type Inference: Various Designs

I'm exploring the right data types for writing a type inference with higher kinds and poly types.

Putting more things in the type system can force you to think about more things, but it also can make it harder and more verbose to write and read algorithms.

@chrisdone
chrisdone / types.hs
Last active June 11, 2022 23:43
types
{-# LANGUAGE TypeOperators, LambdaCase, StandaloneDeriving, GADTs #-}
data Type env t where
-- A constant type. Add kinds?
-- Maybe, (), Int, Either, (->), etc.
Constructor :: kind -> Type env kind
-- A free variable.
-- a
FreeVariable :: kind -> Type env kind
-- Type application.
@chrisdone
chrisdone / ackermann.dhall
Last active April 7, 2020 09:02 — forked from Gabriella439/ackermann.dhall
Ackermann function in Dhall
-- Credit to: https://news.ycombinator.com/item?id=15186988
let iterate
: (Natural → Natural) → Natural → Natural
= \f n ->
fold (n + 1) f 1
let increment : Natural → Natural = \n -> n + 1
let ackermann
@chrisdone
chrisdone / normalized applicative.hs
Last active March 20, 2020 11:57
normalized applicative.hs
{-# LANGUAGE Strict #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds, ScopedTypeVariables #-}
-- http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
import Data.Function
import Data.List.NonEmpty (NonEmpty(..))
@chrisdone
chrisdone / Control.Applicative.Normalized.hs
Created March 20, 2020 10:20
Control.Applicative.Normalized.hs
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds, ScopedTypeVariables #-}
-- http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
import GHC.Exts
data NAF :: (* -> Constraint) -> (* -> *) -> * -> * where
Pure :: a -> NAF c t a
Ap :: c x => NAF c t (x -> a) -> t x -> NAF c t a
@chrisdone
chrisdone / Data.Functor.NormalizedConstrained.hs
Last active March 20, 2020 10:04
Data.Functor.NormalizedConstrained.hs
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds #-}
-- Paper: http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
-- Talk: https://vimeo.com/69261960
import GHC.Exts
data NF :: (* -> Constraint) -> (* -> *) -> * -> * where
FMap :: c x => (x -> a) -> t x -> NF c t a
{-# LANGUAGE OverloadedStrings #-}
-- |
module RIO.ConcurrentLog where
import qualified Data.ByteString.Builder as SB
import Data.List
import Data.Time
import RIO
@chrisdone
chrisdone / applicative-th.hs
Created February 24, 2020 16:04
Applicative TH
applicative :: Q Exp -> [Q Exp] -> Q Exp
applicative cons [] = [| pure $(cons) |]
applicative cons (x:ys) = foldl (\inner y -> [| $(inner) <*> $(y) |]) [|$(cons) <$> $(x)|] ys
@chrisdone
chrisdone / Data.Conduit.Error.hs
Created February 16, 2020 21:02
Data.Conduit.Error
-- | Conduit piping with error handling.
module Data.Conduit.Error where
import Data.Conduit.Internal
infixr 2 .|?
(.|?) :: Monad m => ConduitT a b m (Either e ()) -> ConduitT b c m (Either e r) -> ConduitT a c m (Either e r)
ConduitT left0 .|? ConduitT right0 =
ConduitT $ \rest ->
@chrisdone
chrisdone / FlushSource.hs
Last active February 6, 2020 11:21
Flushing source conduit
{-# LANGUAGE LambdaCase #-}
-- | Sources that flush when their monadic action takes longer than n
-- microseconds.
module Data.Conduit.Flush where
import Data.Conduit
import Data.Conduit.Internal as Pipe (ConduitT(..), Pipe(..))
import UnliftIO