Skip to content

Instantly share code, notes, and snippets.

View mbrcknl's full-sized avatar
🕸️
catching bugs

Matthew Brecknell mbrcknl

🕸️
catching bugs
View GitHub Profile
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -Wall #-}
data HList f l where
HNil :: HList f '[]
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilyDependencies #-}
data Ty = IntTy | FunTy Ty Ty
@mbrcknl
mbrcknl / PHOAS.hs
Last active October 21, 2017 04:41
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
data Ty = IntTy | FunTy Ty Ty
data Term :: (Ty -> *) -> Ty -> * where
Lit :: Int -> Term var IntTy
theory locale_experiment
imports Main
begin
section \<open>Algebraic formulation of a semilattice\<close>
locale semigroup =
fixes ap :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"
assumes assoc: "\<And>x y z. ap x (ap y z) = ap (ap x y) z"
@mbrcknl
mbrcknl / after.agda
Last active September 5, 2017 11:29
Code from BFPG talk about dependent types in Agda
-- Matthew Brecknell @mbrcknl
-- BFPG.org, March-April 2015
-- With thanks to Conor McBride (@pigworker) for his lecture series:
-- https://www.youtube.com/playlist?list=PL44F162A8B8CB7C87
-- from which I learned most of what I know about Agda, and
-- from which I stole several ideas for this talk.
open import Agda.Primitive using (_⊔_)
theory Scratch imports Main begin
locale Magma =
fixes m :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"
locale SemiGroup = Magma +
assumes assoc: "\<And>x y z. m (m x y) z = m x (m y z)"
locale Commutative = Magma +
assumes comm: "\<And>x y. m x y = m y x"
Definition p5 : com :=
WHILE (BNot (BEq (AId X) (ANum 1))) DO
HAVOC X
END.
Definition p6 : com :=
X ::= ANum 1.
Lemma p5_may_terminate: forall s, p5 / s || update s X 1.
intro s; destruct (eq_nat_dec (s X) 1).
import Data.Set.Monad as SM
import Debug.Trace as DT
(<+>) = liftM . plus
plus x y = DT.trace "." (x + y)
l = SM.fromList [0,1]
-- Intuitively expect 28 additions, but we actually get 60!
test = Set Int
@mbrcknl
mbrcknl / .profile
Created March 23, 2013 09:06
How I start gpg-agent on login to OS X. I use Macports gnupg2, with pinentry +qt4, though with a suitable adjustment to the PATH, this should work if you get your gnupg from somewhere else.
# ...
if [ -f ~/.gpg-agent-info ]; then
. ~/.gpg-agent-info
export GPG_AGENT_INFO
fi
# ...
Require Import List.
Inductive type : Type :=
| base : type
| arr : type -> type -> type.
Infix "==>" := arr (right associativity, at level 52).
Inductive elem {A: Type} (x: A): list A -> Type :=
| here : forall xs, elem x (x :: xs)