การใช้ F # ในด้านใดบ้างที่เหมาะสมกว่า C # [ปิด]


210

ในช่วงไม่กี่ปีที่ผ่านมา F # ได้พัฒนาเป็นหนึ่งในภาษาที่รองรับอย่างเต็มที่ของ Microsoft โดยใช้ความคิดมากมายที่บ่มเพาะใน OCaml, ML และ Haskell

ในช่วงหลายปีที่ผ่านมา C # ได้ขยายคุณสมบัติของวัตถุประสงค์ทั่วไปโดยการแนะนำคุณสมบัติภาษาที่ใช้งานได้มากขึ้น: LINQ (ความเข้าใจในรายการ), แลมบ์ดา, การปิด, ผู้แทนนิรนามและอื่น ๆ ...

กำหนดให้ C # ใช้คุณสมบัติการทำงานเหล่านี้และอนุกรมวิธานของ F # เป็นภาษาหน้าที่ไม่บริสุทธิ์ (ช่วยให้คุณสามารถเข้าถึงไลบรารีเฟรมเวิร์กหรือเปลี่ยนสถานะที่ใช้ร่วมกันเมื่อเรียกใช้ฟังก์ชันหากคุณต้องการ) มีความคล้ายคลึงกันระหว่างสองภาษา ขั้วตรงข้ามของตัวเองเน้นหลัก

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

คำตอบ:


258

ฉันได้เขียนแอพพลิเคชั่นเพื่อสร้างความสมดุลตารางการผลิตไฟฟ้าของประเทศสำหรับพอร์ตโฟลิโอของโรงไฟฟ้าไปยังตำแหน่งการค้าสำหรับ บริษัท พลังงาน ไคลเอ็นต์และส่วนประกอบเซิร์ฟเวอร์อยู่ใน C # แต่เอ็นจิ้นการคำนวณถูกเขียนใน F #

การใช้ F # เพื่อจัดการกับความซับซ้อนที่เป็นหัวใจของแอปพลิเคชันนี้แสดงให้เห็นถึงจุดที่ชัดเจนสำหรับภาษาภายในซอฟต์แวร์ขององค์กรซึ่งเป็นการวิเคราะห์เชิงอัลกอริทึมที่ซับซ้อนของชุดข้อมูลขนาดใหญ่ ประสบการณ์ของฉันเป็นสิ่งที่ดีมาก โดยเฉพาะอย่างยิ่ง:

หน่วยวัดอุตสาหกรรมที่ฉันทำงานอยู่จะถูกทิ้งไว้กับหน่วย สมการที่ฉันนำมาใช้ (มักจะเป็นลักษณะทางเรขาคณิต) จัดการกับหน่วยของเวลาพลังงานและพลังงาน การมีระบบประเภทตรวจสอบความถูกต้องของหน่วยของอินพุตและเอาต์พุตของฟังก์ชั่นเป็นตัวช่วยประหยัดเวลาได้อย่างมากทั้งในแง่ของการทดสอบและการอ่าน / ทำความเข้าใจโค้ด มันกำจัดข้อผิดพลาดทั้งชั้นที่ระบบก่อนหน้านี้มีแนวโน้มที่จะ

การเขียนโปรแกรม Exploratory การทำงานกับไฟล์สคริปต์และ REPL (F # Interactive) ทำให้ฉันสามารถสำรวจพื้นที่โซลูชันได้อย่างมีประสิทธิภาพมากขึ้นก่อนที่จะยอมรับการนำไปใช้มากกว่าลูป Edit / compile / run / test แบบดั้งเดิม มันเป็นวิธีที่เป็นธรรมชาติมากสำหรับโปรแกรมเมอร์ที่จะสร้างความเข้าใจในปัญหาและความตึงเครียดในการออกแบบ

การทดสอบหน่วยรหัสที่เขียนโดยใช้ฟังก์ชั่นที่ไม่มีผลข้างเคียงและโครงสร้างข้อมูลที่เปลี่ยนแปลงไม่ได้คือความสนุกในการทดสอบ ไม่มีการโต้ตอบขึ้นอยู่กับเวลาที่ซับซ้อนในการไขสิ่งต่าง ๆ หรือชุดการอ้างอิงขนาดใหญ่ที่จะเยาะเย้ย

การทำงานร่วมกันฉันกำหนดส่วนต่อประสานกับเครื่องมือคำนวณใน C # และนำการคำนวณไปใช้ใน F # เอ็นจินการคำนวณสามารถถูกฉีดเข้าไปในโมดูล C # ใด ๆ ที่จำเป็นต้องใช้โดยไม่ต้องกังวลเกี่ยวกับการทำงานร่วมกัน ไม่มีรอยต่อ โปรแกรมเมอร์ C # ไม่จำเป็นต้องรู้

การลดรหัสข้อมูลส่วนใหญ่ที่ป้อนเข้าสู่เครื่องมือคำนวณนั้นอยู่ในรูปของเวกเตอร์และเมทริกซ์ ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นกินอาหารเช้าเหล่านี้ด้วยความยุ่งยากน้อยที่สุด สวย.

ไม่มีข้อบกพร่องการเขียนโปรแกรมฟังก์ชั่นสามารถรู้สึกแปลก ฉันสามารถทำงานกับอัลกอริทึมพยายามอย่างหนักเพื่อให้โค้ดผ่านตัวตรวจสอบชนิด แต่เมื่อตัวตรวจสอบชนิดพอใจแล้วก็ใช้งานได้ มันเกือบไบนารีมันจะไม่รวบรวมหรือถูกต้อง ข้อผิดพลาดเล็ก ๆ น้อย ๆ ของขอบถูกย่อให้เล็กลง, การเรียกซ้ำและฟังก์ชันการสั่งซื้อที่สูงขึ้นลบรหัสการเก็บหนังสือจำนวนมากที่แนะนำข้อผิดพลาดของ edge edge

Parallelismความบริสุทธิ์ของการใช้งานที่เกิดขึ้นนั้นทำให้การใช้ประโยชน์จากความเท่าเทียมในการประมวลผลของเวกเตอร์ของข้อมูลนั้นมีความสมบูรณ์ บางทีนี่อาจเป็นที่ที่ฉันจะไปต่อไปในตอนนี้ที่. NET 4 กำลังจะเปิดตัว


18
+1 เพื่ออธิบายว่าทำไม F # เหมาะมากสำหรับเครื่องมือค้นหาตัวเลข อีก (เสมือน) +1 สำหรับการกล่าวถึงหน่วยวัด ส่วนหนึ่งของภาษานั้นสมควรได้รับการกล่าวถึงบ่อยขึ้น
cfern

5
คำตอบที่ยอดเยี่ยมมีความเกี่ยวข้องสมัยและโครงร่าง F # ความเหมาะสมสำหรับการจัดการกับความซับซ้อนฉันได้เรียนรู้มากมายจากการอ่านขอบคุณ
Peter McG

คำตอบที่ยอดเยี่ยมไซม่อนและเมื่อดอนพูดถึงเมื่อคืนนี้อ้างถึงในสไลด์ล่าสุดของเขา ถึงเวลาเพิ่มลิงก์ "เพิ่มในรถเข็น" หรือไม่
Chris Ballard

1
สวัสดีคุณได้รับอนุญาตให้บอกเราเพิ่มเติมเกี่ยวกับสถาปัตยกรรมแอพของคุณหรือไม่
Nikos

76

ระหว่างการฝึกงานที่ Microsoft Research ฉันทำงานในบางส่วนของ Visual Studio IntelliSense สำหรับ F # (ซึ่งเขียนด้วยตัวเองใน F #) ฉันมีประสบการณ์กับ IntelliSense จากโครงการ C # ก่อนหน้านี้แล้วดังนั้นฉันคิดว่าฉันสามารถเปรียบเทียบทั้งสองได้

  • Visual Studio Extensibility ยังคงใช้ COM อยู่ดังนั้นคุณต้องจัดการกับวัตถุที่ไม่ดีมากสำหรับวัตถุ. NET (และไม่สามารถใช้งานได้) แต่ฉันไม่รู้สึกว่ามีความแตกต่างที่สำคัญระหว่าง C # และ F # (ทำงานได้อย่างราบรื่น จาก F #)

  • โครงสร้างข้อมูลที่ใช้เพื่อแสดงรหัสโปรแกรมใน F # ส่วนใหญ่เป็นสหภาพที่แบ่งแยก (ซึ่งไม่ได้รับการสนับสนุนใน C # ด้วยวิธีที่สมเหตุสมผล) และสิ่งนี้ทำให้เกิดความแตกต่างอย่างมากสำหรับแอปพลิเคชันประเภทนี้ (ที่คุณต้องการประมวลผลโครงสร้างต้นไม้ ) Discriminated unions และการจับคู่รูปแบบช่วยให้คุณสามารถจัดโครงสร้างโค้ดได้ดีขึ้น (เก็บฟังก์ชันการทำงานที่เกี่ยวข้องไว้ในที่เดียวแทนที่จะเก็บไว้ทั่วในรูปแบบเสมือน)

ก่อนหน้านี้ฉันยังทำงานกับผู้ให้บริการ CodeDOM สำหรับ F # (เขียนเป็น F # ด้วย) จริงๆแล้วฉันทำการทดลองครั้งแรกใน C # แต่จากนั้นแปลงรหัสเป็น F #

  • ผู้ให้บริการ CodeDOM ต้องสำรวจโครงสร้างบางส่วนที่แสดงโดยใช้ออบเจ็กต์. NET ดังนั้นจึงไม่มีพื้นที่มากพอสำหรับการประดิษฐ์การแสดงข้อมูลของคุณเอง (ซึ่งเป็นพื้นที่ที่ F # สามารถให้ประโยชน์ที่ดี)

  • อย่างไรก็ตามมีฟีเจอร์ F # ขนาดเล็กจำนวนมากที่ทำให้งานง่ายขึ้น เนื่องจากคุณต้องการสร้างสตริงฉันจึงกำหนดผู้ประกอบการที่กำหนดเองสำหรับการสร้างสตริง (โดยใช้StringBuilder) และใช้รหัสโดยใช้พวกเขาและฟังก์ชั่นการสั่งซื้อที่สูงขึ้น (เช่นการจัดรูปแบบรายการวัตถุที่คั่นด้วยสตริงที่ระบุเป็นต้น) ทำซ้ำ (และforeachลูปน่าเบื่อ)

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


6
น่าสนใจมากและมีหลักฐานมากขึ้นว่าการรับ F # ใน Microsoft สูงมากแน่นอนว่าการฝึกงานที่ยอดเยี่ยมนั้นต้องเกิดขึ้น!
Peter McG

43

เราจัดส่งผลิตภัณฑ์เชิงพาณิชย์ชิ้นแรกของโลกที่เขียนใน F # ( F # สำหรับการสร้างภาพ ) และผลิตภัณฑ์ที่สอง ( F # สำหรับตัวเลข ) รวมถึงวรรณกรรมเชิงพาณิชย์เล่มแรกใน F # ( The F # .NET Journal ) และเขียนและเผยแพร่หนังสือเล่มเดียวเกี่ยวกับรุ่นปัจจุบัน ของ F # ( Visual F # 2010 สำหรับการคำนวณทางเทคนิค )

เราได้จัดส่งผลิตภัณฑ์ตามบรรทัดที่คล้ายกันที่เขียนใน C # (เช่นนี้ ) แต่เรามีพื้นหลังที่แข็งแกร่งในการใช้งานเชิงพาณิชย์ของ OCaml เรามีความกระตือรือร้นในช่วงเริ่มต้นของการใช้ F # เมื่อมันยังเป็นต้นแบบการวิจัยย้อนกลับไปในปี 2549 เพราะเราตระหนักถึงศักยภาพของการมีภาษา OCaml เหมือนที่ทันสมัยบนแพลตฟอร์ม. NET ที่แข็งแกร่งในอุตสาหกรรมและดังนั้นเราจึงผลักดันให้มีการผลิต ผลลัพธ์นั้นประสบความสำเร็จอย่างเหลือเชื่อและ F # เกินความคาดหมายที่สูงส่งของเรา

สำหรับเรา F # มีข้อได้เปรียบที่แตกต่างกันมากมายและเราใช้มันเพื่อการใช้งานที่หลากหลาย เรามีรหัส F # หลายแสนบรรทัดในการผลิต ตอนนี้เราใช้ F # สำหรับแอพ LOB ทั้งหมดของเรา: การทำธุรกรรมบัตรเครดิตของเราดำเนินการโดยใช้รหัส F # การแจ้งเตือนผลิตภัณฑ์ของเราจะถูกส่งโดยใช้รหัส F # การสมัครสมาชิกของเราจัดการโดยใช้รหัส F # บัญชีของเราจะใช้รหัส F # บางทีคุณสมบัติภาษาหลักที่จ่ายเงินปันผลที่นี่คือการจับคู่รูปแบบ เรายังใช้ F # เพื่อเน้นสีไวยากรณ์หนังสือเล่มล่าสุดของเรา ...

ไลบรารีการแสดงภาพประกอบเพลงของเราเป็นผู้ขายรายใหญ่และศูนย์การทำงานบน F # แบบโต้ตอบที่เรียกใช้ใน Visual Studio ห้องสมุดของเราเพิ่มสิ่งนี้ด้วยความสามารถในการวางไข่การแสดงภาพแบบ 2D และ 3D แบบโต้ตอบด้วยความพยายามขั้นต่ำ (เช่นเพียงแค่Plot([Function sin], (-6., 6.))เพื่อพล็อตคลื่นไซน์) โดยเฉพาะอย่างยิ่งปัญหาเธรดทั้งหมดเป็นไปโดยอัตโนมัติอย่างสมบูรณ์ดังนั้นผู้ใช้ไม่ต้องกังวลเกี่ยวกับเธรด UI และการจัดส่ง ฟังก์ชั่นชั้นหนึ่งและความเกียจคร้านมีค่าอย่างยิ่งเมื่อเขียนส่วนนี้ของห้องสมุดและประเภทข้อมูลเกี่ยวกับพีชคณิตถูกนำมาใช้อย่างกว้างขวางในที่อื่น ประสิทธิภาพที่คาดการณ์ได้พิสูจน์แล้วว่ามีคุณค่าที่นี่เมื่อลูกค้าของเราพบข้อบกพร่องด้านประสิทธิภาพในการทดสอบยอดฮิตของ WPF และสามารถปรับใช้รหัสที่เกี่ยวข้องใน F # ได้อย่างง่ายดายสำหรับการปรับปรุงประสิทธิภาพ 10,000 × เนื่องจากลักษณะที่เป็นรูปแบบอิสระของ GUI ของผลิตภัณฑ์นี้ผู้ออกแบบ GUI และ C # จะไม่ได้รับประโยชน์

งานส่วนใหญ่ของเราหมุนรอบวิธีการเชิงตัวเลขรวมถึงห้องสมุดและหนังสือเชิงพาณิชย์ของเรา F # มีความแข็งแรงกว่าในพื้นที่นี้มากกว่า C # เนื่องจากมี abstractions ระดับสูง (เช่นฟังก์ชั่นที่มีลำดับสูงกว่า) และมีบทลงโทษน้อยที่สุด ผลลัพธ์ที่น่าสนใจที่สุดของเราในบริบทนี้คือการสร้างการแยกย่อย QR แบบง่าย ๆ แต่โดยทั่วไปจากพีชคณิตเชิงเส้นที่สั้นกว่ารหัส Fortran 20 เท่าจากการใช้งานอ้างอิงของ LAPACK เร็วกว่า Intel Math ที่ปรับได้ 3 เท่า ไลบรารีเคอร์เนลและทั่วไปมากขึ้นเนื่องจากรหัสของเราสามารถจัดการเมทริกซ์ทุกประเภทแม้แต่เมทริกซ์สัญลักษณ์

ขณะนี้เรากำลังพัฒนาส่วนประกอบ WPF / Silverlight ด้วยการผสมผสานของ F # (สำหรับความกล้า) และ C # (สำหรับ shim) การสร้างแอป WPF เพื่อทำหน้าที่เป็นคู่มือเชิงโต้ตอบสำหรับผลิตภัณฑ์ซอฟต์แวร์ของเราและฉันกำลังเขียนหนังสือเล่มใหม่ Multicore F # ที่ จะเป็นแนวทางที่ชัดเจนสำหรับการเขียนโปรแกรมขนานหน่วยความจำที่ใช้ร่วมกันบน. NET


คุณเป็นคนเดียวกับจอน Harrop ที่เขียนว่า "F # สำหรับนักวิทยาศาสตร์" หรือไม่?
Andre Artus

7
ใช่. ฉันเขียน F # สำหรับนักวิทยาศาสตร์ 5 ปีที่แล้ว
Jon Harrop

คุณมีการอ้างอิงบางส่วนสำหรับรหัสการสลายตัว QR ใน F # ที่คุณพูดถึงในวรรคสุดท้ายของคุณหรือไม่? ขอบคุณ
Samik R

@SamikR: ไม่ขอโทษ นั่นคือรหัสการค้า มันง่ายที่จะเขียน
Jon Harrop

@ มีคำพูดใด ๆ บน Multicore F # ไหม
ศาสตราจารย์ bigglesworth

25

ในช่วง 6 เดือนที่ผ่านมาฉันได้ทำงานกับเลเยอร์ Vim อีมูเลชันสำหรับ Visual Studio 2010 มันเป็นผลิตภัณฑ์ฟรีที่มีแหล่งที่มาทั้งหมดที่สามารถใช้ได้อย่างอิสระบน github

โครงการแบ่งออกเป็น 3 DLL แสดงถึงเลเยอร์ที่แตกต่าง แต่ละชั้นมี dll ทดสอบหน่วยที่สอดคล้องกัน

  1. เครื่องยนต์เป็นกลุ่ม: F #
  2. WPF layer สำหรับการตกแต่งและการรวมเอดิเตอร์: C #
  3. เลเยอร์การรวม Visual Studio: C #

นี่เป็นโครงการใหญ่ครั้งแรกที่ฉันได้ทำกับ F # และฉันต้องบอกว่าฉันรักภาษา ในหลาย ๆ ทางฉันใช้โครงงานนี้เป็นวิธีการเรียนรู้ F # (และเส้นโค้งการเรียนรู้นี้ชัดเจนมากถ้าคุณดูประวัติของโครงการ)

สิ่งที่ฉันพบว่าน่าประหลาดใจที่สุดเกี่ยวกับ F # คือความกระชับของภาษา โปรแกรม Vim ประกอบด้วยส่วนใหญ่ของตรรกะ แต่มันประกอบด้วยเพียง 30% ของฐานรหัสโดยรวม


19
Editor ... ภาษาที่ใช้งานได้ ... vi emulation ... คุณได้ประดิษฐ์ emac ขึ้นมาใหม่ NOOOOOOOOOOOOOOOOOOOOOOO!
Ben Voigt

2
ยกเว้นว่ามันเป็น "ได้รับการรับรอง 100% วงเล็บฟรี" :)
พาเวล Minaev

@Pavel ยกเว้น tuples ของหลักสูตรและวิธีการโทร .net
JaredPar

26
บันทึกสองสิ่งที่นี่ ก่อนอื่น tuples ไม่ต้องการ()ใน F # - ,โอเปอเรเตอร์คือสิ่งที่สร้างขึ้นมาดังนั้นlet x = 1,2tuple ที่ถูกต้องอยู่แล้วโดยไม่มี parens ใด ๆ ประการที่สอง parens คู่ใด ๆ ใน F # สามารถถูกแทนที่ด้วยคู่ของbegin.. end(ซึ่งสืบทอดมาจาก ML) - ตัวอย่างเช่น"foo".IndexOf begin 'a', 1 endเป็นการเรียกเมธอด. NET ที่ถูกต้อง ดังนั้นหากคุณเคยต้องการที่จะ parens ฟรี F # เป็นภาษาหนึ่งที่ช่วยให้คุณทำแค่นั้น :)
พาเวล Minaev

ความคิดเห็นตลกพาเวล! ไม่ทราบว่า ผมคิดว่าในบางกรณีที่มีการจัดกลุ่มบล็อกขนาดใหญ่ที่จริงผมอาจจะชอบ..begin endยัง: VsVim RULES!
Dan Fitch

13

การทดสอบหน่วยจำนวนมากสำหรับส่วนประกอบ F # Visual Studio นั้นเขียนด้วย F # พวกเขาทำงานนอก VS เยาะเย้ยบิต Visual Studio ต่างๆ ความสามารถในการพิจารณาวัตถุที่ไม่ระบุชื่อที่ใช้อินเทอร์เฟซนั้นมีประโยชน์แทนที่โครงร่าง / เครื่องมือ ฉันสามารถเขียนได้

let owpe : string list ref = ref []
let vsOutputWindowPane = 
    { new IVsOutputWindowPane with
        member this.Activate () = err(__LINE__)
        member this.Clear () = owpe := []; 0
        member this.FlushToTaskList () = VSConstants.S_OK
        member this.GetName(pbstrPaneName) = err(__LINE__)
        member this.Hide () = err(__LINE__)
        member this.OutputString(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputStringThreadSafe(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputTaskItemString(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText) = err(__LINE__)
        member this.OutputTaskItemStringEx(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText, pszLookupKwd) = err(__LINE__)
        member this.SetName(pszPaneName) = err(__LINE__)
    }            
DoSomethingThatNeedsA(vsOutputWindowPane)
assert( !owpe = expectedOutputStringList )

เมื่อฉันต้องเช่นตัวอย่างของการเป็นนักการIVsOutputWindowPaneส่งผ่านไปยังบางส่วนองค์ประกอบอื่น ๆ ที่จะได้รับการเรียกร้องOutputStringและClearจากนั้นตรวจสอบstring list refวัตถุในตอนท้ายของการทดสอบเพื่อดูว่าการส่งออกที่คาดว่าจะถูกเขียน


น่าสนใจและมีหลักฐานเพิ่มเติมว่าการรับ F # ภายใน Microsoft สูงอย่างแน่นอน ฉันไม่รู้ว่าคุณสามารถสร้างวัตถุที่ไม่ระบุตัวตนที่ใช้อินเทอร์เฟซใน F #
Peter McG

9

เราเขียนภาษาเอ็นจินของกฏที่กำหนดเองโดยใช้การปรับใช้ Lex-Yacc ใน F #

แก้ไขเพื่อรวมการตอบความคิดเห็น

ไม่มีการใช้ lex / yacc ใน C # (เท่าที่เราทราบและ F # หนึ่งคือ)

มันจะเป็นไปได้ แต่ความเจ็บปวดอย่างจริงจังที่จะสร้างการแยกวิเคราะห์ตัวเราเอง

หัวข้อนี้แสดงคำแนะนำอื่น ๆ เช่นห้องสมุดภายนอก แต่สถาปนิกหลักของเราเป็นมือเก่าในภาษาที่ใช้งานได้ดังนั้นการเลือกใช้ F # จึงไม่ใช่เรื่องง่าย


+1 คุณเคยเขียนสิ่งนี้ในภาษา C # ว่ามันไม่เหมาะสมหรือช้ากว่าด้วยเหตุผลบางอย่าง?
Peter McG

@Peter McGrattan อย่างน้อยในเวลาที่เขียน (ซอฟต์แวร์) ไม่มีการใช้งาน lex / yacc ใน C # มันจะเป็นไปได้ แต่ความเจ็บปวดอย่างจริงจังที่จะสร้างการแยกวิเคราะห์ตัวเราเอง stackoverflow.com/questions/540593/lex-yacc-for-cแสดงคำแนะนำอื่น ๆ แต่สถาปนิกที่เป็นผู้นำของเราเป็น
มือเก่า

ถ้าคุณคิดว่าไม่มี lex / yacc สำหรับ C # ฉันกลัวว่าคุณจะไม่ได้ดูหนักพอสำหรับมัน (มีหนึ่งเก่ากว่า F #) ที่กล่าวว่าถ้าคุณต้องการ lex / yacc F # อยู่ในความคิดของฉันเหมาะสมกว่ามาก ค้อนสำหรับตะปูนั้นดีกว่า c #
Rune FS

ฉันใช้ F # กับ fslex / fxyacc ด้วยตัวเองแม้ว่าจะไม่ได้อยู่ในโครงการ "การผลิต" (ยังไม่ได้เปิดตัว) - การเน้นไวยากรณ์ของ MSIL และการขยายโค้ดให้สมบูรณ์สำหรับ VS ประโยชน์หลักของการใช้ F # คือคุณได้รับ ADT ซึ่งสะดวกมากในการเป็นตัวแทนการแยกวิเคราะห์ต้นไม้ นอกจากนี้การใช้รูดซิป ( en.wikipedia.org/wiki/Zipper_(data_structure) ) ช่วยให้การเพิ่มเลเยอร์ - และการบีบอัดทำได้ง่ายขึ้นง่ายต่อการจัดการใน F #
Pavel Minaev

7

ฉันกำลังรวบรวมคอมไพล์สำหรับภาษาโปรแกรม คอมไพเลอร์เขียนทั้งหมดใน F # คอมไพเลอร์ (นอกเหนือจาก lex และ parser build ด้วย lex / yacc) นั้นโดยทั่วไปแล้วจะเป็นการสร้างการเปลี่ยนแปลงของต้นไม้ที่ซับซ้อนเช่นโครงสร้าง

ดังที่คนอื่น ๆ แยกแยะสหภาพแรงงานและการจับคู่รูปแบบทำให้การทำงานกับโครงสร้างข้อมูลชนิดนี้ง่ายกว่าการทิ้งรหัสในวิธีการเสมือน "ทั่วทุกที่"

ฉันยังไม่ได้ทำงาน F # ใด ๆ ก่อนที่ฉันจะเริ่มทำงานกับคอมไพเลอร์ (ฉันมีคอมไพเลอร์ buld ในตัวแปร OCaml อีกชื่อหนึ่งที่ชื่อว่า MoscowML) และเมื่อ Jared ระบุว่ามันสามารถมองเห็นได้จากโค้ดว่าส่วนใดที่ฉันทำก่อน เพื่อเรียนรู้การเข้าสู่ความคิด FP อีกครั้งหลังจากการเข้ารหัส OO ส่วนใหญ่เป็นเวลาหนึ่งทศวรรษจะใช้เวลานานกว่านั้น

ทำงานกับต้นไม้กันฉันพบความสามารถในการเขียนรหัสการประกาศผลประโยชน์หลักของ FP (F # รวม) มีรหัสที่อธิบายอัลกอริทึมฉันพยายามที่จะใช้ในทางตรงกันข้ามกับ C # อธิบายว่าฉันใช้ algortihm เป็นประโยชน์อย่างมาก


6

ไม่ใช่ประสบการณ์ส่วนตัว แต่คุณสามารถฟังตอนของ DNR (ฉันคิดว่ามันเป็นเหตุการณ์นี้ ) ที่พวกเขาพูดคุยกับชาว Microsoft เกี่ยวกับ F # พวกเขาเขียนระบบการให้คะแนน Xbox Live เกือบทั้งหมดซึ่งอยู่ไกลจากเรื่องเล็กน้อยโดยใช้ F # ระบบปรับขนาดอย่างหนาแน่นในหลายร้อยเครื่องและพวกเขาก็พอใจกับมันมาก


5

ฉันไม่รู้ว่ามันกำลังใช้งานจริงหรือไม่ แต่ AI สำหรับ "The Path of Go" ถูกเขียนใน F #:

http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo

The Path of Go: เกมวิจัยของ Microsoft สำหรับ Xbox 360

การสาธิตนี้แสดงให้เห็นถึงเกม Xbox 360 ซึ่งเป็นเกมของ Go ผลิตใน บริษัท ที่ Microsoft Research Cambridge Go เป็นหนึ่งในเกมกระดานที่มีชื่อเสียงที่สุดในเอเชียตะวันออกมันมีต้นกำเนิดในประเทศจีนเมื่อ 4000 ปีก่อน เบื้องหลังความเรียบง่ายที่หลอกลวงของเกมซ่อนความซับซ้อนอย่างมาก ใช้เวลาเรียนรู้เพียงไม่กี่นาที แต่ใช้เวลาตลอดชีวิตในการเรียนรู้ แม้ว่าคอมพิวเตอร์จะมีทักษะเหนือกว่ามนุษย์ในการเล่นหมากรุก เกมดังกล่าวใช้เทคโนโลยีสามตัวที่พัฒนาโดย Microsoft Research Cambridge: AI ที่สามารถเล่น Go, ภาษา F # และ TrueSkill ™เพื่อจับคู่ผู้เล่นออนไลน์ AI ดำเนินการใน F # และตรงกับความท้าทายในการทำงานอย่างมีประสิทธิภาพใน. net compact Framework บน Xbox 360 เกมนี้นำคุณเข้าสู่ฉาก 3 มิติที่น่าทึ่ง มันได้รับการพัฒนาอย่างเต็มที่ในรหัสที่มีการจัดการโดยใช้สภาพแวดล้อม XNA

(มีคนพูดถึง "TrueSkill" แล้ว)


ที่น่าสนใจ: F # ทำงานบนกรอบขนาดกะทัดรัดบน XBox FSharp.Core.dll ไม่พร้อมกับ FSharp.Core.optdata FSharp.Core.sigdata ชุดประกอบที่ไม่ใช่ CF อ้างอิงหรือไม่
Peter McG

1
CTP มาพร้อมกับ FSharp แยกต่างหากซึ่งเป็นรุ่นต่อไปสำหรับ. NETCF (นอกจากนี้ยังมี FSharp.Core แยกต่างหากสำหรับ Silverlight.)
ไบรอัน

CTP นี้ที่คุณพูดถึงคืออะไร?
Jwosty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.