Skip to content

Instantly share code, notes, and snippets.

View kuribas's full-sized avatar

Kristof Bastiaensen kuribas

View GitHub Profile
module Main
import Data.String
import Data.Maybe
import Data.List
import Data.List.Elem
import Data.Vect
import Records
interface HandlerImpl handler where
handlerLabel : String

Idris2 proofs of leftPad and fulcrum from the Great theorem prover showdown. https://www.hillelwayne.com/post/theorem-prover-showdown/

An attempt was made to make readable proofs which can be easily followed.

Some final observations:

  • idris2 is not made for intrinsics proofs, even though it provides facilities for it. It can be felt in the way the standard library is organised. Some proofs are missing (proofs about Int, about
import Data.List
infixr 1 =~
infixr 1 >~
infixr 1 =~<
(=~) : (a:k) -> {b:k} -> (a = b) -> (a = b)
(=~) _ prf = prf
qed : {a:k} -> (a = a)
module Records
import Data.String
import Data.Maybe
import Data.List
import Data.List.Elem
import Data.Vect
import Data.Morphisms
import Decidable.Equality
import Data.IOArray.Prims
@kuribas
kuribas / records.idr
Created September 17, 2022 21:57
extensible records
module Main
import Data.String
import Data.Maybe
import Data.List
import Data.List.Elem
import Data.Vect
import Data.Morphisms
import Decidable.Equality
infixr 10 :->
@kuribas
kuribas / parametrised.idr
Created January 31, 2022 08:59
parametrised record
record Foo (f : Type -> Type) where
constructor MkFoo
baz : f Int
bar : f String
Identity : Type -> Type
Identity x = x
foo2 : Foo Identity
foo2 = MkFoo { baz = 9.3
@kuribas
kuribas / recordoperations.hs
Created August 14, 2021 12:52
recordoperations
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
@kuribas
kuribas / validationt.hs
Created August 12, 2021 08:31
validation
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module ValidationT where
import Data.Validation
import Data.Functor.Compose
import Control.Monad.IO.Class
import qualified Data.DList as DList
import Control.Monad.Except
import Data.These
-- | Applicative only validation transformer
@kuribas
kuribas / memoize.hs
Created August 11, 2021 08:26
memoize
memoize2 :: (Eq a, Hashable a) => (a -> IO b) -> IO (a -> b)
memoize2 f = do
ref <- newIORef HashMap.empty
pure $ \x ->
do mp <- readIORef ref
case HashMap.lookup x mp of
Nothing -> unsafePerformIO $ do
res <- f x
writeIORef ref $ HashMap.insert x res mp
pure res
@kuribas
kuribas / test.hs
Created January 5, 2021 20:47
aeson gadt
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeApplications #-}
module Test where
import Data.Aeson
import Data.Aeson.Types
import Data.Text (Text)
import Data.Scientific
import Control.Monad
import Control.Applicative