This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 = |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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) }) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; ...] |
OlderNewer