Created
June 18, 2018 23:38
-
-
Save essic/9d1bbad8340fc47a73a1a6efb3fd5ca5 to your computer and use it in GitHub Desktop.
SimpleFSharpDemo-03 created by essic - https://repl.it/@essic/SimpleFSharpDemo-03
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
module Implem03 | |
open System | |
type Age = int | |
type FirstName = string | |
type LastName = string | |
type Person = | |
{ FirstName : FirstName | |
LastName : LastName | |
Age : Age } | |
type ConsultantSkills = | |
| CSharp | |
| FSharp | |
| Java | |
| Finance | |
| ECommerce | |
type ManagerBU = | |
| SGCIB | |
| Natixis | |
| BNP | |
type Collaborator = | |
| Consultant of Person * (ConsultantSkills list) | |
| Manager of Person * ManagerBU | |
let isNull a = | |
//List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State | |
a |> List.fold (fun state str -> state || String.IsNullOrWhiteSpace(str) ) false | |
let createPerson firstName lastName age = | |
if ( age < 0 ) || (isNull [firstName; lastName]) then | |
None | |
else | |
{ FirstName = firstName ; LastName = lastName ; Age = age } |> Some | |
let createConsultant firstName lastName age skills = | |
createPerson firstName lastName age | |
|> Option.map (fun person -> Consultant (person,skills) ) | |
let createManager firstName lastName age bu = | |
createPerson firstName lastName age | |
|> Option.map (fun person -> Manager (person,bu)) | |
let whoAreYou collaborator = | |
match collaborator with | |
| Consultant (p,_) -> printfn "I am a %i years old, consultant. My name is %s %s" p.Age p.FirstName p.LastName | |
| Manager (p,_) -> printfn "I am a %i years old, manager. My name is %s %s" p.Age p.FirstName p.LastName | |
collaborator | |
let whatDoYouDo collaborator = | |
match collaborator with | |
| Manager (_,businessUnit) -> printfn "I handle business on %s" <| sprintf "%A" businessUnit | |
| Consultant (_,skills) -> | |
match skills with | |
| [] -> printfn "I have no skills yet !" // I handle the case where skills is an empty list ! | |
| _ -> // For any other case ! | |
let skillsString = List.reduce (fun acc elem -> acc + ", " + elem) ( skills |> List.map (sprintf "%A") ) | |
printfn "I work on %s" skillsString | |
collaborator | |
let customPrint collaborator = | |
printfn "***********************" | |
collaborator | |
|> (whoAreYou >> whatDoYouDo) |> ignore | |
printfn "***********************" | |
[<EntryPoint>] | |
let main argv = | |
// We create some collaborators | |
let collaborators = | |
[ | |
createConsultant "Aly-Bocar" "Cisse" 32 [CSharp;FSharp] | |
createManager "Luffy" "Dragon" 20 SGCIB | |
createConsultant "Nobody" "Ulysse" 15 [] | |
createManager "Kevin" "" 25 Natixis //Should fail ! | |
createConsultant null "Something" 30 [Java] //Should fail ! | |
createConsultant "Gandalf" "The Gray" -200 [Finance] // Should fail ! | |
] | |
//Let's iterate on every Collaborator and print ! | |
collaborators | |
|> List.iter (Option.map customPrint >> ignore) | |
0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment