.NET Logo
Welcome Guest Search | Active Topics | Members | Log In | Register

มาทำความรู้จักกับ Lambda Expression กันดีกว่า Options · View
digitake
Posted: Monday, March 24, 2008 1:58:10 PM

Rank: มือมืด
Groups: Member

Joined: 3/21/2008
Posts: 53
Location: Whenever you code,you've reached my places.

Lambda Expression

เป็นชุด Syntax ที่ถูกสร้างมาจาก Lambda Calculus โดยมีจุดประสงค์เพื่อช่วยในการให้นิยามฟังก์ชัน, การใช้งานฟังก์ชันและการเวียนซ้ำ(Recursion)
พูดอย่างง่ายคิอช่วยให้เราสร้างชุดคำสั่งได้จากรูปแบบการนิยามฟังก์ชันที่เหมือนการนิยามฟังก์ชันทางคณิตศาสตร์ หรือการช่วยในการเขียนโปรแกรมเชิงฟังก์ชันนั่นเอง(Functional programming) สำหรับคนที่เคยใช้โปรแกรมพวก Maple, Matlab น่าจะคุ้นน่าคุ้นตาดี

มองอีกมุมหนึ่ง Lambda Expression(ใน C# 3.0) ก็เป็นพัฒนาการขั้นต่อมาของ Anonymous method ใน C# 2.0
โดนใน C# 2.0 นั้นเมื่อเราต้องการสร้างการทำงานเพียงครั้งเดียวและไม่ต้องการใช้ซ้ำหรือแชร์ส่วนของโค้ดร่วมกับส่วนอื่น
เราสามารถสร้างชุดการทำงานเฉพาะที่ซึ่ง จริงๆแล้วสามารถมองเหมือน method หนึ่งได้ แต่จะไม่สามารถอ้างถึงผ่านชื่อ
ของ Method ได้(เพราะว่ามันไม่มีชื่อ) เราจึงเรียกมันว่า Anonymous method (ใช้ delegate อ้างไปยัง method แทน)
ดังตัวอย่างต่อไปนี้

สมมติว่าเราสร้าง List ของ int 1 - 20
List
<int> iList = new List<int>();
for (int i = 1; i < 20; ++i)
   iList.Add(i);

เราต้องการจะแยกเอาเฉพาะเลขคี่
List<int> oddList1 = iList.FindAll(delegate(int i) { return (i & 1) == 1; });
ในวงเล็บ FindAll คือตัวอย่างการใช้งาน Anonymous method

ซึ่งเราสามารถแทนด้วย Lambda Expression ได้ดังนี้
List<int> oddList2 = iList.FindAll((i) => (i & 1) == 1);

ลองพิมพ์ออกมาดู
oddList1.ForEach((i) => { Console.Write(i+" "); });
oddList2.ForEach((i) => { Console.Write(i+" "); });

ได้ผลลัพธ์
1 3 5 7 9 11 13 15 17 19

ให้สังเกตุรูปแบบการเขียน Lambda Expression
ซึ่งจะมีรูปแบบดังนี้
([ตัวแปร]) => นิพจน์หรือชุดคำสั่ง;
เช่น

(i) => (i & 1) == 1
ความหมายคือ รับค่า parameter เข้าทางตัว i
นำ i ดำเนินการ BitWise And กับ 1 ซึ่งถ้าผลลัพธ์เหลือค่า 1
หมายถึง i เป็นเลขคี่ ซึ่งจะทำให้ตัวดำเนินการ == ให้ค่า true


Lambda Expression นั้นทำให้ C# เริ่มดูเหมือน Functional Language เข้าไปทุกทีแต่
C# นั้นมีข้อดีที่เด่นกว่าภาษาอื่นๆมาก เรียกได้ว่าเป็นภาษาที่รับกับเงื่อนไขทางทฤษฎีและปฏิบัติได้อย่างลงตัวมากๆ
ตัวอย่างเช่นการ มี Unified Type แต่ไม่ทำให้ความเร็วเสียไปเหมือนภาษา Smalltalk
Lambda Expression ก็เช่นกันถึงแม้จะดูเหมือนว่าเราไม่ต้องสนใจ Type ของผลลัพธ์ของ Lambda Expression
แต่จริงๆแล้วมันยังคงเป็น Strong type อยู่

 



Love = λygh·g(y(y)(h,g), y(y)(h,g))

Code:
Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U)
       = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U)
       = I(Love(Love)(U,I), Love(Love)(U,I))
       = I(Love(Love)(U,I))

Love Combinator!!!!

digitake
Posted: Friday, April 18, 2008 5:33:55 PM

Rank: มือมืด
Groups: Member

Joined: 3/21/2008
Posts: 53
Location: Whenever you code,you've reached my places.

อาจมีคนสงสัยว่าตัว Lambda expression นี้มีประโยชน์อะไรออกจากทำให้โค้ดมันดูแปลกตา

คำตอบก็คือมีประโยชน์มากสำหรับการเขียนโปรแกรมแบบ stateless ที่ซึ่งจำเป็นมาสำหรับการรองรับ
โปรแกรมที่เป็น Concurrency เพราะว่าทุกอย่างจะถูก pass-by-value และตัว lambda เองเป็น immutable object
ดังนั้นมั่นใจได้ว่าจะไม่เกิด racing conditions จากตัว lambda แน่นอน

บางคนสงสัยอีกว่าตัว lambda นั้นสามารถเขียนโปรแกรมได้ครอบคลุม คือสามารถแทนที่ตัว syntax ของ C# ปกติหรือไม่
คำตอบคือทำได้ แต่จะต้องปรับระบบความคิดกันนิดหน่อย

ดูตัวอย่างเช่นการเขียน recursive function ในรูปของ Lambda expression
http://seethesharp.spaces.live.com/blog/cns!2A7877D6642160EC!171.entry



Love = λygh·g(y(y)(h,g), y(y)(h,g))

Code:
Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U)
       = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U)
       = I(Love(Love)(U,I), Love(Love)(U,I))
       = I(Love(Love)(U,I))

Love Combinator!!!!

mrxc
Posted: Friday, April 18, 2008 6:04:25 PM
Rank: มือเทพ
Groups: Member

Joined: 3/6/2008
Posts: 176
Location: TH

เดี๋ยวก็มีคนสงสัยอีกว่า Concurrency คืออะไรผมว่าอธิบายยาวไปเลยดีกว่าไหมครับ

ส่วนตัวผมแล้ว Concurrency ผมไม่เคยใช้กับพวก Software เลยเคยใช้แต่กับพวก Hardware (จำพวกภาษา VHDL, Verilog)

บอกตรงๆครับว่าบน Software ผมก็ไม่เห็นความสำคัญของมัน เพราะว่ายังไม่เคยใช้มั้งครับ ผมเองก็อยากรู้เหมือนกัน

ถ้าจะอธิบายเรื่องการใช้งาน Concurrency บน Software จะดีมากครับ

digitake
Posted: Friday, April 18, 2008 8:24:43 PM

Rank: มือมืด
Groups: Member

Joined: 3/21/2008
Posts: 53
Location: Whenever you code,you've reached my places.

แหม เล่นถามแบบนี้ เรือ่งมันยาวครับ เรื่อง concurrency นี่ซับซ้อนพอจะเขียนเป็นตำราเล่มๆได้เลย
ดังนั้นจะให้ผมอธิบายที่เดียวจบคงเป็นไปไม่ได้ครับ ได้แต่บอกคร่าวๆได้ดังนี้

Concurrency เป็นคุณสมบัติของระบบ(คอมพิวเตอร์)ใดๆที่สามารถประมวลผลหลายๆงานไปได้พร้อมๆกัน
และ
มีปฏิสัมพันธ์ต่อกันเพื่อแลกเปลี่ยนข้อมูลหรือสถานะของการประมวลผล

ประโยชน์ของ Concurrent programming?
1. โลกทุกวันนี้เป็น(หรือถ้ามองอย่าง conservative สุด : กำลังจะเป็น)โลกของ Multicore-CPU
     ซึ่งชัดเจนว่าโปรแกรมที่ดีคือโปรแกรมที่ถูกออกแบบมาเพื่อใช้ทรัพยากรที่มืออยู่จำกัดให้เกิดประโยชน์สูงที่สุด(เหมือน Economic rule แฮะ)
     ซึ่งแนวทางการใช้ประโยชน์จาก multicore-cpu นั้นมีอยู่สองแนวคิดคือ
     ก.ไก่ - automatic parallel decomposition : ซึ่งก็คือการที่เราเขียนโปรแกรมไปแบบบปกติทุกวันนี้ แต่ใช้เครื่องมือพิเศษแยกการทำงานให้ cpu แต่ละตัวประมวลผล
     ข.ไข่ - concurrent design ซึ่งก็คือการออกแบบให้ระบบมีการรองรับ asynchronization ตั้งแต่ระดับโครงสร้าง
     แน่นอนว่าแบบ ก. จะง่ายกว่า แบบ ข. แต่สำหรับโปรแกรมที่เป็น performance critical นั้นจำเห็นต้องใช้ แบบ ข.
เพิ่มเติม : ถ้าใครบ้าหนังเรื่อง The Matrix การประมวลผล matriix นั้นต้องใช้ concurrent design กับการประมวลผล matrix ขนาดใหญ่ เห้นประโยชน์รึยัง อิอิ

2. Slow Device : ทุกวันนี้โลกเราชักมีช่องว่างระหว่าง fast device กับ slow device มากขึ้นทุกที HDD มี access time ในระดับ ms แต่ ram ล่อไป ns เร็วกว่าพันเท่า
    และยังไม่นับการประมวลผลที่ใช้ข้อมูลจาก Network รอไปเถอะ... เสียเวลาไหม? เสียเวลามากๆ ต้องมานั่งรอโหลด ทางแก้ละ? = concurrency

3. Human User : มนุษย์เรานี่ละตัวดีเวลารอให้โปรแกรมโหลดมันเบื่อไหมที่หน้าจอมันจะค้างๆ? ทำอะไรก็ไม่ได้ เซ็งไหม? ถ้าเซ็งละก็มองมาที่ concurrency สิคับ

4. Distributed system : ทุกวันนี้โปรแกรมมันไม่ได้รันอยู่บนเครื่องโดดๆอีกต่อไปแล้ว มันกระจายอยู่บน Network และผลที่ตามมาคือ ... concurrency อย่างหลีกเลี่ยงไม่ได้...

สรุปน่ะ
Concurrency -> โปรแกรมทำงานหลายๆ Thread และมี Interaction ต่อกันเพื่อประมวลผลงานหนึ่งๆ....จบ
-------
นิดนึง
VHDL, Verilog เป็นภาษาที่ใช้ออกแบบ Hardware ซึ่งจะเป็นคนละเรื่องกับ Concurrency
Concurrency สามารถใช้งานได้แม้แต่ ASM หรือ VB C++ Java Perl JavaScript etc. กล่าวสั้นๆคือ Concurrency เป็น Abstraction



Love = λygh·g(y(y)(h,g), y(y)(h,g))

Code:
Love(Love)(I, U) = λgh·g(Love(Love)(h,g), Love(Love)(h,g))(I, U)
       = λh·I(Love(Love)(h,I), Love(Love)(h,I))(U)
       = I(Love(Love)(U,I), Love(Love)(U,I))
       = I(Love(Love)(U,I))

Love Combinator!!!!

mrxc
Posted: Friday, April 18, 2008 9:10:30 PM
Rank: มือเทพ
Groups: Member

Joined: 3/6/2008
Posts: 176
Location: TH

ครับ VHDL, Verilog เป็นภาษาออกแบบ Hardware ซึ่ง Hardware ส่วนมากจะทำงานเป็น Concurren อยู่แล้วครับ

 

ซึ่งผมสงสัยก็คือมีกรณีไหนบ้างที่เราต้องการให้ Software ทำงานเป็น concurren บ้าง แต่ก็พอได้คำตอบแล้วครับ ขอบคุณมากๆครับ

Users browsing this topic
Guest


Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

Main Forum RSS : RSS

YAFVision Theme Created by Jaben Cargman (Tiny Gecko)
Powered by Yet Another Forum.net version 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.


Sponsored by