Skip to content

Instantly share code, notes, and snippets.

@palladin
palladin / gist:1084507
Created July 15, 2011 11:20
Norvig's Spelling Corrector
// Norvig's Spelling Corrector: http://norvig.com/spell-correct.html
open System.IO open System.Text.RegularExpressions
let edits1 (word : string) =
let splits = [for i in 0 .. word.Length do yield (word.[0..i-1], word.[i..])]
let deletes = [for a, b in splits do if b <> "" then yield a + b.[1..]]
let transposes = [for a, b in splits do if b.Length > 1 then yield a + string b.[1] + string b.[0] + b.[2..]]
let replaces = [for a, b in splits do for c in 'a'..'z' do if b <> "" then yield a + string c + b.[1..]]
let inserts = [for a, b in splits do for c in 'a'..'z' do yield a + string c + b]
deletes @ transposes @ replaces @ inserts |> Set.ofList
@palladin
palladin / gist:1084511
Created July 15, 2011 11:21
Functional style Regex engine
let char c (s : string) = seq { if s.Length > 0 && s.[0] = c then yield s.Substring(1) }
let (=>) l r s = seq { for sl in l s do for sr in r sl -> sr }
let (<|>) l r s = seq { yield! l s; yield! r s }
let rec (<*>) e s = seq { yield s; yield! (e => (<*>) e) s }
let (<+>) e = e => (<*>) e
@palladin
palladin / gist:1084515
Created July 15, 2011 11:24
Actors acting as Lambdas
// Useful type aliases
type Actor = MailboxProcessor<obj>
type Ident = string
type Cond = Actor
type Env = Actor
let (<!>) (actor : Actor) (msg : 'T) = actor.Post msg
// run forever - template
@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
@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: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: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: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: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: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; ...]