C# Functional แบบงงๆ
Tags: csharp, functional
Published: 2020-02-25 15:46:56

สำหรับใครที่เป็นแฟนพันธุ์แท้ C# จะรู้ว่าความสามารถใหม่ (เมื่อนานมาแล้ว) จะสามารถเขียน Functional เหมือนกับภาษา F# หรือ Scala ได้ ซึ่งมันเป็นอะไรที่ว้าวมาก... (โดยเฉพาะผมที่พึ่งได้มีเวลาพักหายใจ)
เข้าเรื่องกันเลยดีกว่า

I know the Greek C# already know the new feature of her. Her have the functional feature like F# or Scala. But for me, this feature is Wowww.

Ok, let's start.

เริ่มแรกผมจะสร้าง Console App ขึ้นมาโดยจะเลือก Target Framework ไปที่ 4.8 ส่วนชื่อโปรเจคก็ตามใจชอบ หลังจากสร้างโปรเจคใหม่แล้ว ตัว Visual Studio ก็จะเปิดไฟล์ Program.cs ขึ้นมา ซึ่งรูปแบบคำสั่งเองก็จะมีลักษณะ ดังนี้

First I will create the console application and select the project target to .Net Framework 4.8, but for the project name; I think you can enter from your need. After create, We will get the code like this.

{% gist https://gist.github.com/VatthanachaiW/9e1d9ccb45bb7b57c223a7901b1d0043.js 
 %}

จากนั้นเราก็มา Re-Factor Code กันใหม่นิดหนึ่ง (ซึ่งเอาจริงๆ ไม่ต้องทำก็ได้ ข้ามไปเลยก็ได้ ฮ่าๆ)

Now, I have re-factor the code by removing unused code. and this is the result of re-factor. or you can skip this step.

{% gist https://gist.github.com/VatthanachaiW/0b2650335c4611f13265cc374cd93df4.js %}

หลังจากไร้สาระกันไปแล้ว ต่อไปเราก็จะเริ่มเขียนฟังกชั่นง่ายๆ ตัวนึงขึ้นมา โดยที่โค๊ดจะมีดังนี้

Next, I have writing some functional like this.

{% gist https://gist.github.com/VatthanachaiW/a7bd034eb68c735f3afb78b843810107.js %}

และเมื่อเราทดลองรันโปรแกรมของเราดู ก็จะได้ผลลัพท์ เท่ากับ 3 ...
ว่าแต่.. Dev.to ทำใมใส่รูปได้แค่รูปเดียวเองแหะ... เอาเป็นว่าลองไปรันคำสั่งใน dotnetfiddle เอานะครับ

And when I executed. the result is 3.
I don't know why 'Dev.to' can insert only 1 image. Don't worry, please use the below link to test on the Dotnet Fiddle.

https://dotnetfiddle.net/Widget/NHqzJa

จากโค๊ด ... เราได้กำหนดให้ฟังก์ชัน f รับค่า x เข้ามาและนำ x ไปบวกด้วย 2 ซึ่งถ้าเราป้อนค่าให้กับ x โดนกำหนดให้เป็น 1 ผลลัพธ์ที่ได้ก็จะมีค่าเท่ากับ 3 นั่นเอง

From the Functional... I create the f function has the x parameter, and take him to add 2. and when I set x value is 1, the result is 3.

ทีนี้เราจะมาลองเขียนโค๊ดชุดนี้กันแบบสั้นๆ โดยจะเขียนคำสั่งดังนี้

Next, I will create a short functional like this.

{% gist https://gist.github.com/VatthanachaiW/e0e0c35c995cf9d5a4a256bb649fbe2a.js %}

และหลังจากทดลองรันดูแล้ว ผลลัพธ์ที่ได้ก็จะเท่ากับ 3 เหมือนกับข้างบน

After executed. The result is 3. Why the result like the previous function?

https://dotnetfiddle.net/Widget/B4yI3i

โอ้ววววว ไม่ต้องใส่ Func<int,int> นำหน้า f ก็สามารถทำงานได้เหมือนกัน แจ่มปะละ ซึ่งก็จะรวมไปถึง i ที่เมื่อรับค่าจาก f แล้วก็ไม่จำเป็นต้องใส่ int เพราะค่าที่ได้ยังไงก็ได้กลับมาเป็น int แน่นอน

Because of the c# can use the shortcode.The 'f' gets the 'x' parameter and add '2' to 'x';
when I set 'i' to get the value from 'f', The 'i' will get the result from 'f'.

นี่ละที่เป็นความสามารถใหม่ที่ทำให้ว้าวจริงๆ เอาเป็นว่าพอแค่นี้ก่อนดีกว่าง่วงนอนมากกก ไว้ว่างๆ มีเวลาหายใจเดี๋ยวค่อยมาลองเขียน function ใหม่ๆ กันดู

I think this feature is very new for me haha.

ส่งท้ายขยายความ... Func<int, int> คืออะไร...

Finally, What is the 'Function<int, int>'?

Func => Function
และค่าที่อยู่ใน <> จะมีความหมายคือ.. <Type, Result> 
โดยที่ input type จะสามารถรับได้ที่ 16 ตัว และ Result 1 ตัว 

Func is from Function and the first type in '<>' is the input type and the final type is always is the result type.

Func < T1, T2, T3, ... T16, Result > (พิมพ์ติดแล้วกลายเป็น markdown / I cannot type without space, because this code will change to the markdown.)

ในตัวอย่าง Func<int, int> f = (x) => x + 2; นั้น หากเราเอามาเขียนเป็น Full Function ก็จะได้คำสั่งแบบนี้

From this function 'Func<int, int> f = (x) => x + 2;'. If we want to create the full function. This is the code. Haha.

{% gist https://gist.github.com/VatthanachaiW/c0b78e0b4b9d564827bc66785fda316a.js %}