Skip to content

Instantly share code, notes, and snippets.

@johnazariah
Forked from dsyme/gist:99e208bf1801a47f96d1
Created August 25, 2014 04:06
Show Gist options
  • Save johnazariah/dd0200f1a6cc98a2a95b to your computer and use it in GitHub Desktop.
Save johnazariah/dd0200f1a6cc98a2a95b to your computer and use it in GitHub Desktop.
type Building =
{ left : int
right : int
height : int }
let buildings = []
let getHeight building = building.height
let getWidth building = building.right - building.left
let getArea building = getHeight building * getWidth building
type Op =
{ map : Building -> int
reduce : int -> int -> int
zero : int }
let maxHeight =
{ map = getHeight
reduce =
(fun l r ->
if l < r then l
else r)
zero = System.Int32.MinValue }
let minWidth =
{ map = getWidth
reduce =
(fun l r ->
if l > r then l
else r)
zero = System.Int32.MaxValue }
let totalArea =
{ map = getArea
reduce = (+)
zero = 0 }
let fs = [ maxHeight; minWidth; totalArea ]
// Use the foldBack pattern:
// foldBack (extractor >> combiner) elements state
let limits =
[ for f in fs -> List.foldBack (f.map >> f.reduce) buildings f.zero ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment