Skip to content

Instantly share code, notes, and snippets.

@palladin
palladin / gist:1088007
Created July 17, 2011 20:12
Type based Regex Active Patterns
// Based on http://blogs.msdn.com/b/chrsmith/archive/2008/02/22/regular-expressions-via-active-patterns.aspx
open System
open System.Text.RegularExpressions
let (|Match|_|) (pat:string) (inp:string) =
let m = Regex.Match(inp, pat) in
if m.Success
then Some (List.tail [ for g in m.Groups -> g.Value ])
@palladin
palladin / gist:1086249
Created July 16, 2011 10:38
Functor => Applicative => Monad
#r "FSharp.PowerPack.dll"
open System
// Generic container of 'T
// Also parameterized by 'TypeClass : (new : unit -> 'TypeClass)
// to implicit get a 'TypeClass instance (like passing the type class dictionary)
// The idea is to encode Type Classes with subtype polymorphism and OOP Classes
type Generic<'T, 'TypeClass when 'TypeClass : (new : unit -> 'TypeClass)> = interface end
@palladin
palladin / gist:1086248
Created July 16, 2011 10:37
Monadic Memoization
// Inspired by http://www.cs.utexas.edu/~wcook/Drafts/2006/MemoMixins.pdf
// State Monad combined with Continuation Monad (StateT Monad transformer)
type StateContMonad<'s, 'a, 'r> = StateContMonad of ('s -> ('s -> 'a -> 'r) -> 'r)
// Computation Builder
type StateContBuilder() =
member self.Return value =
StateContMonad (fun state k -> k state value)
member self.Bind(StateContMonad contStateMonad, f) =
@palladin
palladin / gist:1085042
Created July 15, 2011 16:39
Infinite sequences
// Haskell-inspired infinite sequences
#r "FSharp.Powerpack"
let rec repeat n = LazyList.consDelayed n (fun () -> repeat n)
repeat 1 // seq [1; 1; 1; 1; ...]
let rec integersFrom n = LazyList.consDelayed n (fun () -> LazyList.map ((+) 1) <| integersFrom n)
integersFrom 3 // seq [3; 4; 5; 6; ...]
@palladin
palladin / gist:1085040
Created July 15, 2011 16:37
A simple Quine
let s : Printf.TextWriterFormat<_> = "let s : Printf.TextWriterFormat<_> = %c%s%c in
printf s (char 34) (s.Value) (char 34)" in printf s (char 34) (s.Value) (char 34)
@palladin
palladin / gist:1085035
Created July 15, 2011 16:36
A Lazy fixed-point combinator
// x = f(x) encoded in F#
let force (value : Lazy<_>) = value.Force()
let fix f = let rec x = lazy (f x) in x
// Examples
let fac = fix (fun f x -> if x = 0 then 1 else x * force f (x - 1) )
let nums = fix (fun v -> seq { yield 0; yield! Seq.map ((+) 1) (force v) })
@palladin
palladin / gist:1085033
Created July 15, 2011 16:35
The repmin problem
// For more info
// http://www.springerlink.com/content/g74174vvl1861605/
// http://www.haskell.org/haskellwiki/Circular_programming
// Helper functions
let force (value : Lazy<_>) = value.Force()
let lazyMap f l = lazy (f (force l))
// Generic feedback loop function
let trace f input =
@palladin
palladin / gist:1085030
Created July 15, 2011 16:33
A Clojure inspired (race free) memoize function
// Info: http://clojure.org/atoms
open System
open System.Threading
type Atom<'T when 'T : not struct>(value : 'T) =
let refCell = ref value
let rec swap f =
let currentValue = !refCell
@palladin
palladin / gist:1085027
Created July 15, 2011 16:32
Clojure's Atoms
open System.Threading
type Atom<'T when 'T : not struct>(value : 'T) =
let refCell = ref value
let rec swap f =
let currentValue = !refCell
let result = Interlocked.CompareExchange<'T>(refCell, f currentValue, currentValue)
if obj.ReferenceEquals(result, currentValue) then ()
else Thread.SpinWait 20; swap f
@palladin
palladin / gist:1084722
Created July 15, 2011 13:46
Functional Unparsing SQL
// Functional Unparsing http://www.brics.dk/RS/98/12/BRICS-RS-98-12.pdf
open System
open System.Data
open System.Data.SqlClient
// Type Decls
type SqlText = string
type Counter = int