Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type Name = string;;
- type Sex = | M // male
- | F // female
- type YearOfBirth = int;;
- type FamilyTree = P of Name * Sex * YearOfBirth * Children
- and Children = FamilyTree list
- let fred = P("Fred",M,1970,[])
- let joan = P("Joan",F,1975,[])
- let may = P("May",F,1945,[fred;joan])
- let stanley = P("Stanley",M,1975,[])
- let peter = P("Peter",M,2005,[])
- let bob = P("Bob",M,2008,[])
- let eve = P("Eve",F,2010,[])
- let mary = P("Mary",F,1980,[peter;bob;eve])
- let jane = P("Jane",F,1985,[])
- let joe = P("Joe",M,1950,[stanley;mary;jane])
- let paul = P("Paul",M,1955,[])
- let larry = P("Larry",M,1920,[may;joe;paul])
- let sexToString = function
- |M -> "Male"
- |F -> "Female"
- let formatter (P(n,s,yob,c)) = "name: " + n + " sex: " + (sexToString s) + " yearofbirth: " + (sprintf "%i" yob) + " names of children:" + (List.foldBack (fun (P(cn,_,_,_)) list -> " " + cn + list) c "")
- let findAux p tree =
- let rec findInner t =
- match t with
- | P(n,_,_,_) when p(n) -> Some(t)
- | P(_,_,_,children) -> children |> List.choose (findInner)
- |> List.tryFind(fun _ -> true)
- | P(_,_,_,[]) -> None
- findInner tree
- let find n t =
- let optionToString g =
- match g with
- | Some(p) -> formatter p
- | None -> failwith "No such person"
- findAux (fun k -> k = n) t
- |> optionToString
- let test34 = find "Joe" larry
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement