Continue with the Basics by Example; today's version of the post written in F# Enjoy!
I was thinking in changing the name of this post to "F# - OO Basics by Example" because I guess its confusing the fact that F# is more a Functional Programming language than an Imperative one, even if both paradigms are well supported by the language. At the end I decided to leave it like that, I just want to make clear that you will not find any "Functional Basics" on this post ;) ... I will probably do the same in my next Scala post.
You can copy and paste the code below in your favorite IDE/Editor and start playing and learning with it. This little "working" program will teach you the basics of the Programming Language.
There are some "comments" on the code added just to tell you what are or how are some features called. In case you want to review the theory, you can read my previous post, where I give a definition of each of the concepts mentioned on the code. You can find it here: http://carlosqt.blogspot.com/2010/08/new-series-languages-basics-by-example.html
Greetings Program - Verbose
// F# Basics
namespace GreetProgram
open System
// Constructor
type public Greet(message:string, name:string, loopMessage:int) = class
// Attributes or Fields
let mutable message:string = message
let mutable name:string = name
let mutable loopMessage:int = loopMessage
// Properties
member public this.Name
with get() = name
and set(value:string) = name <- this.Capitalize(value)
member public this.Message
with get() = message
and set(value:string) = message <- this.Capitalize(value)
member public this.LoopMessage
with get() = loopMessage
and set(value:int) = loopMessage <- value
// Overloaded Constructor
new() = Greet("", "", 0)
// Method 1
member private self.Capitalize(value:string) = (
// "if-then-else" statement
if value.Length >= 1 then
value.[0].ToString().ToUpper() + value.[1..]
else
""
)
// Method 2
member public self.Salute() = (
// "for" statement
for i = 1 to self.LoopMessage do
printfn "%s %s!" self.Message self.Name
)
// Overloaded Method 2.1
member public self.Salute(message:string, name:string, loopMessage:int) = (
// "while" statement
let mutable i:int = 0
while i < loopMessage do
printfn "%s %s!" (self.Capitalize message) (self.Capitalize name)
i <- i + 1
)
// Overloaded Method 2.2
member public self.Salute(name:string) = (
// "switch/case" statement is not supported
// using match statement instead
let dtNow:DateTime = DateTime.Now
let t:int = dtNow.Hour
let timeMessage =
match t with
|6|7|8|9|10|11 -> self.Message <- "good morning,"
|12|13|14|15|16|17 -> self.Message <- "good afternoon,"
|18|19|20|21|22 -> self.Message <- "good evening,"
|23|0|1|2|3|4|5 -> self.Message <- "good night,"
| _ -> self.Message <- "huh?"
printfn "%s %s!" (self.Capitalize self.Message) (self.Capitalize name)
)
end
// Console Program
module public GreetProgram =
// Define object of type Greet
let g:Greet = new Greet()
// Instantiate Greet. Call Constructor
// Call Set Properties
g.Message <- "hello"
g.Name <- "world"
g.LoopMessage <- 5
// Call Method 2
g.Salute()
// Call Overloaded Method 2.1 and Get Properties
g.Salute(g.Message, "f#", g.LoopMessage)
// Call Overloaded Method 2.2
g.Salute("carlos")
// Stop and Exit
printfn "Press any key to exit..."
Console.Read() |> ignore
Greetings Program - Minimal
// F# Basics
open System
// Constructor
type Greet(message:string, name:string, loopMessage:int) =
// Attributes or Fields
let mutable message:string = message
let mutable name:string = name
let mutable loopMessage:int = loopMessage
// Properties
member this.Name
with get() = name
and set(value:string) = name <- this.Capitalize(value)
member this.Message
with get() = message
and set(value:string) = message <- this.Capitalize(value)
member this.LoopMessage
with get() = loopMessage
and set(value:int) = loopMessage <- value
// Overloaded Constructor
new() = Greet("", "", 0)
// Method 1
member private self.Capitalize(value:string) =
// "if-then-else" statement
if value.Length >= 1 then
value.[0].ToString().ToUpper() + value.[1..]
else
""
// Method 2
member self.Salute() =
// "for" statement
for i = 1 to self.LoopMessage do
printfn "%s %s!" self.Message self.Name
// Overloaded Method 2.1
member self.Salute(message:string, name:string, loopMessage:int) =
// "while" statement
let mutable i:int = 0
while i < loopMessage do
printfn "%s %s!" (self.Capitalize message) (self.Capitalize name)
i <- i + 1
// Overloaded Method 2.2
member self.Salute(name:string) =
// "switch/case" statement is not supported
// using match statement instead
let dtNow = DateTime.Now
let t = dtNow.Hour
let timeMessage =
match t with
|6|7|8|9|10|11 -> self.Message <- "good morning,"
|12|13|14|15|16|17 -> self.Message <- "good afternoon,"
|18|19|20|21|22 -> self.Message <- "good evening,"
|23|0|1|2|3|4|5 -> self.Message <- "good night,"
| _ -> self.Message <- "huh?"
printfn "%s %s!" (self.Capitalize self.Message) (self.Capitalize name)
// Console Program
// Define object of type Greet
let g = Greet()
// Instantiate Greet. Call Constructor
// Call Set Properties
g.Message <- "hello"
g.Name <- "world"
g.LoopMessage <- 5
// Call Method 2
g.Salute()
// Call Overloaded Method 2.1 and Get Properties
g.Salute(g.Message, "f#", g.LoopMessage)
// Call Overloaded Method 2.2
g.Salute("carlos")
// Stop and Exit
printfn "Press any key to exit..."
Console.Read() |> ignore
And the Output is:

interesting :)
ReplyDeleteHey Carlos!
ReplyDeleteIn F# the "new" keyword is optional!
That means that you need to remove it from the "Greetings Program - Minimal"
Current: let g = new Greet()
Should be: let g = Greet()
You should also update the F# number of keywords used in the "How many keywords you write in your code Part 2" post.
Thank you for your/my comment!
ReplyDeleteI will do it as soon as possible :)