หมวดหมู่ทฤษฎีมีประโยชน์สำหรับการเรียนรู้การเขียนโปรแกรมการทำงานหรือไม่


118

ฉันกำลังเรียน Haskell และฉันก็หลงใหลในภาษานี้ อย่างไรก็ตามฉันไม่มีพื้นฐานทางคณิตศาสตร์หรือ CS อย่างจริงจัง แต่ฉันเป็นโปรแกรมเมอร์ซอฟต์แวร์ที่มีประสบการณ์

ฉันต้องการเรียนรู้ทฤษฎีหมวดหมู่เพื่อที่ฉันจะสามารถพัฒนาได้ดีขึ้นที่ Haskell

ฉันควรเรียนรู้หัวข้อใดในทฤษฎีหมวดหมู่เพื่อเป็นพื้นฐานที่ดีสำหรับการทำความเข้าใจ Haskell


1
ยังเห็นเกี่ยวกับหมวดหมู่ทฤษฎีทฤษฎีการเขียนโปรแกรมภาษา
Kaveh

1
ฉันขอขอบคุณที่คุณแยกแยะการเขียนโปรแกรมและ cs
jmite

4
"ทฤษฎีหมวดการเรียนรู้ที่จะดีขึ้นใน Haskell" เป็นเหมือน "ฟิสิกส์การเรียนรู้ที่จะดีขึ้นในกีฬาเทนนิส"
26756

คำตอบ:


115

ในคำตอบก่อนหน้าในเว็บไซต์วิทยาการคอมพิวเตอร์ฉันกล่าวว่าทฤษฎีหมวดหมู่เป็น "รากฐาน" สำหรับทฤษฎีประเภท ที่นี่ฉันอยากจะพูดอะไรบางอย่างที่แข็งแกร่ง หมวดหมู่ทฤษฎีคือทฤษฎีประเภท ตรงกันข้ามประเภททฤษฎีคือทฤษฎีประเภท ขอผมขยายจุดเหล่านี้

ทฤษฎีหมวดหมู่เป็นทฤษฎีประเภท

ในภาษาอย่างเป็นทางการใด ๆ พิมพ์และแม้กระทั่งในวิชาคณิตศาสตร์ตามปกติโดยใช้สัญกรณ์ทางการเราจบลงด้วยการประกาศฟังก์ชั่นที่มีชนิดB โดยนัยในการเขียนซึ่งเป็นความคิดที่ว่าและคือบางสิ่งที่เรียกว่า "ประเภท" และคือ "ฟังก์ชัน" จากประเภทหนึ่งไปอีกประเภทหนึ่ง หมวดหมู่ทฤษฎีเป็นทฤษฎีเกี่ยวกับพีชคณิตของ "ประเภท" และ "หน้าที่" (อย่างเป็นทางการหมวดหมู่ทฤษฎีเรียกพวกเขาว่า "วัตถุ" และ "morphisms" เพื่อหลีกเลี่ยงการเหยียบย่ำบนชุดทฤษฎี - เท้าของ traditionalists แต่ยิ่งฉันเห็นนักทฤษฎีหมวดหมู่โยนความระมัดระวังเช่นลมและใช้คำง่าย: "ประเภท "และ" ฟังก์ชั่น "แต่A B ff:ABABf

เราทุกคนได้รับการเลี้ยงดูในทฤษฎีเซตจากโรงเรียนมัธยมเป็นต้นไป ดังนั้นเราจึงใช้ความคิดประเภทต่าง ๆ เช่นและเป็นเซตและฟังก์ชั่นเช่นเป็นการแมป set-theoretic หากคุณไม่เคยคิดถึงสิ่งเหล่านั้นคุณก็จะมีรูปร่างที่ดี คุณได้ล้างสมองการล้างสมองตามทฤษฎีแล้ว ทฤษฎีหมวดหมู่บอกว่ามีหลายประเภทและฟังก์ชั่นหลายประเภท ดังนั้นความคิดของประเภทที่เป็นชุด จำกัด แต่ทฤษฎีหมวดหมู่ axiomatizes ประเภทและฟังก์ชั่นในทางพีชคณิต โดยทั่วไปนั่นคือทฤษฎีหมวดหมู่ ทฤษฎีประเภทและหน้าที่ มันค่อนข้างซับซ้อนมีระดับสูงของนามธรรม แต่ถ้าคุณสามารถเรียนรู้ได้คุณจะได้รับความเข้าใจอย่างลึกซึ้งเกี่ยวกับประเภทและฟังก์ชั่นB fABf

ทฤษฎีประเภทเป็นทฤษฎีหมวดหมู่

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

ในอดีตดาน่าก็อตต์อาจเป็นคนแรกที่รู้เรื่องนี้ เขาทำงานเกี่ยวกับการสร้างแบบจำลองความหมายของภาษาการเขียนโปรแกรมโดยใช้แคลคูลัสแลมบ์ดา แบบจำลองทฤษฎีเซตแบบดั้งเดิมนั้นไม่เพียงพอสำหรับจุดประสงค์นี้เนื่องจากภาษาการเขียนโปรแกรมเกี่ยวข้องกับการเรียกซ้ำแบบไม่ จำกัด ซึ่งทำให้ทฤษฎีขาดความรู้ สกอตต์คิดค้นชุดของรุ่นความหมายที่ถูกจับปรากฏการณ์การเขียนโปรแกรมและมาถึงตระหนักว่าพิมพ์แลมบ์ดาแคลคูลัสว่าเป็นตัวแทนของระดับของประเภทที่เรียกว่าประเภทปิดคาร์ทีเซียน มีหมวดหมู่ปิดคาร์ทีเซียนมากมายที่ไม่ใช่ "set-theoretic" แต่แคลคูลัสแลมบ์ดาที่พิมพ์ลงไปใช้ได้กับพวกมันทุกคนเท่ากัน Scott เขียนเรียงความที่ดีที่เรียกว่า " ทฤษฎีที่เกี่ยวข้องของแลมบ์ดาแคลคูลัส"อธิบายว่าเกิดอะไรขึ้นบางส่วนดูเหมือนจะมีอยู่ในเว็บบทความต้นฉบับตีพิมพ์ในหนังสือเล่มหนึ่งที่เรียกว่า" กับ HB แกง: บทความเกี่ยวกับ Combinatory ตรรกศาสตร์แลมบ์ดาแคลคูลัสและพิธีการ "กดวิชาการ 2523 เบอร์รี่และ Curien มาถึงสำนึกเดียวกันอาจจะเป็นอิสระ. พวกเขากำหนดเครื่องนามธรรมเด็ดขาด (CAM) ในการใช้ความคิดเหล่านี้ในการดำเนินการภาษาการทำงานและภาษาที่พวกเขาดำเนินการถูกเรียกว่า "CAML" ซึ่งเป็นกรอบพื้นฐานของไมโครซอฟท์F #

ก่อสร้างประเภทมาตรฐานเช่น , ,ฯลฯfunctors นั่นหมายความว่าพวกเขาไม่เพียง แต่แมปประเภทกับประเภท แต่ยังทำงานระหว่างประเภทกับฟังก์ชั่นระหว่างประเภท ฟังก์ชั่น Polymorphicรักษาฟังก์ชั่นดังกล่าวทั้งหมดที่เกิดจากการกระทำ functor ทฤษฎีหมวดหมู่ถูกประดิษฐ์ขึ้นในปี 1950 โดยEilenberg และ MacLaneL ฉันs T×Listแม่นยำในการทำให้เป็นแนวคิดของฟังก์ชัน polymorphic พวกเขาเรียกพวกเขาว่า "การแปลงตามธรรมชาติ", "ธรรมชาติ" เพราะมันเป็นสิ่งเดียวที่คุณสามารถเขียนในแบบที่ถูกต้องโดยใช้ตัวแปรประเภท ดังนั้นอาจกล่าวได้ว่าทฤษฎีหมวดหมู่นั้นถูกประดิษฐ์ขึ้นอย่างแม่นยำเพื่อทำให้ภาษาการเขียนโปรแกรม polymorphic เป็นทางการแม้แต่ก่อนที่ภาษาการเขียนโปรแกรมจะเข้ามามีบทบาท!

อนุรักษนิยมชุดทฤษฎีไม่มีความรู้เกี่ยวกับ functors และการเปลี่ยนแปลงทางธรรมชาติที่เกิดขึ้นภายใต้พื้นผิวเมื่อเขาใช้สัญลักษณ์ชุดทฤษฎี แต่ตราบใดที่เขาใช้ระบบพิมพ์อย่างซื่อสัตย์เขาก็กำลังสร้างสิ่งก่อสร้างที่เป็นหมวดหมู่ขึ้นมาโดยที่ไม่รู้ตัว


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

อย่างไรก็ตามมีทรัพยากรมากมายบนเว็บซึ่งมีเป้าหมายอยู่ที่โปรแกรมเมอร์ หน้า Haskellwikiสามารถเป็นจุดเริ่มต้นที่ดี ที่บัณฑิตวิทยาลัย Midlandsเรามีการบรรยายเกี่ยวกับทฤษฎีหมวดหมู่ (อื่น ๆ ) หลักสูตรของ Graham Hutton ได้รับการระบุว่าเป็นหลักสูตร "เริ่มต้น" และฉันได้รับการระบุว่าเป็นหลักสูตร "ขั้นสูง" แต่เนื้อหาทั้งคู่ครอบคลุมเนื้อหาเดียวกันเป็นหลัก University of Chalmers มีหน้าแหล่งข้อมูลที่ดีเกี่ยวกับหนังสือและบันทึกการบรรยายจากทั่วโลก บล็อกเว็บไซต์กระตือรือร้นของ "sigfpe"นอกจากนี้ยังมีจำนวนมากที่มีสัญชาติญาณที่ดีจากจุดโปรแกรมเมอร์ของมุมมอง

หัวข้อพื้นฐานที่คุณต้องการเรียนรู้คือ:

  • คำจำกัดความของหมวดหมู่และตัวอย่างของหมวดหมู่
  • functors และตัวอย่างของพวกเขา
  • การเปลี่ยนแปลงตามธรรมชาติและตัวอย่างของพวกเขา
  • คำจำกัดความของผลิตภัณฑ์ coproducts และ exponents (ช่องว่างฟังก์ชัน) วัตถุเริ่มต้นและเทอร์มินัล
  • adjunctions
  • หมวดหมู่ monads, algebras และ Kleisli

บันทึกการบรรยายของฉันเองในMidlands Graduate Schoolครอบคลุมหัวข้อเหล่านี้ทั้งหมดยกเว้นหัวข้อสุดท้าย (monads) วันนี้มีแหล่งข้อมูลอื่น ๆ อีกมากมาย นั่นไม่ใช่การสูญเสียครั้งใหญ่

ยิ่งคุณรู้คณิตศาสตร์มากเท่าไหร่ก็ยิ่งง่ายต่อการเรียนรู้ทฤษฎีหมวดหมู่ เนื่องจากทฤษฎีหมวดหมู่เป็นทฤษฎีทั่วไปของโครงสร้างทางคณิตศาสตร์มันเป็นประโยชน์ที่จะรู้ตัวอย่างเพื่อชื่นชมความหมายของคำนิยาม (เมื่อฉันเรียนรู้ทฤษฎีหมวดหมู่ฉันต้องสร้างตัวอย่างของตัวเองโดยใช้ความรู้ด้านการเขียนโปรแกรมภาษาเพราะหนังสือตำรามาตรฐานมีตัวอย่างทางคณิตศาสตร์เท่านั้นซึ่งฉันไม่รู้อะไรเลย) จากนั้นหนังสือแลคเค็กมาเยี่ยม และสกอตต์เรียกว่า " บทนำสู่ตรรกะเชิงหมวดหมู่"ซึ่งเกี่ยวข้องกับทฤษฎีหมวดหมู่ในการพิมพ์ระบบ (สิ่งที่พวกเขาเรียกว่า" ตรรกะ ") ตอนนี้มันเป็นไปได้ที่จะเข้าใจทฤษฎีหมวดหมู่เพียงแค่เกี่ยวข้องกับประเภทของระบบโดยไม่ต้องรู้ตัวอย่างมากมายทรัพยากรมากมายที่ฉันได้กล่าวไว้ข้างต้นใช้สิ่งนี้ วิธีการอธิบายทฤษฎีหมวดหมู่


3
@UURReddy ฉันไม่เห็นด้วยอย่างยิ่งกับการระบุทฤษฎีหมวดหมู่ของคุณกับทฤษฎีประเภท ทฤษฎีประเภทโมเดิร์นเป็นเรื่องเกี่ยวกับประเภทสำหรับกระบวนการที่เกิดขึ้นพร้อมกันเช่นทฤษฎีประเพณีของประเภทเซสชัน เท่าที่ความรู้ของฉันไม่มีความเข้าใจอย่างชัดเจนของระบบการพิมพ์ดังกล่าว
มาร์ตินเบอร์เกอร์

6
@MartinBerger ฉันคิดว่าการตีความ "ทฤษฎีประเภท" ของคุณแคบไปหน่อย อย่างไรก็ตามฉันยอมรับว่าการทำความเข้าใจประเภททฤษฎีและหมวดหมู่ตามทฤษฎีที่เหมาะสมของประเภทเซสชันปัจจุบันเป็นความท้าทายด้านการวิจัยที่ดีซึ่งฉันตั้งใจจะใช้เวลา
Uday Reddy

2
@MartinBerger เพื่อดูว่าทฤษฎีหมวดหมู่นำไปใช้กับแนวคิดการคำนวณที่สมบูรณ์ยิ่งขึ้นได้อย่างไรฉันขอเชิญคุณดูว่ามันได้ถูกนำไปใช้กับทฤษฎีของการเขียนโปรแกรมเชิงบังคับและความหมายของเกมอย่างไร ดังนั้นฉันไม่เชื่อว่าการเขียนโปรแกรมฟังก์ชั่นมีการผูกขาดในทฤษฎีหมวดหมู่
Uday Reddy

1
@ นิโคลัส, fibrations เป็นวิธีการทำหมวดหมู่ที่จัดทำดัชนีซึ่งรูปแบบขึ้นอยู่กับประเภท การปรับเทียบยังสามารถดูได้ในรูปแบบทั่วไปของตรรกะของโปรแกรมโดยที่หมายถึงแมปพอใจกับค่าพึงพอใจ f P Qf:PQfPQ
Uday Reddy

2
"น่าเสียดายที่ดูเหมือนจะไม่มีหนังสือตำราเกี่ยวกับทฤษฎีหมวดหมู่ที่กำหนดเป้าหมายไปที่โปรแกรมเมอร์โดยเฉพาะ" เป็น "ตำรา" ดังกล่าวขณะนี้มากขึ้นหรือน้อยกว่าที่มีอยู่ในหมวดหมู่ทฤษฎี Bartosz Milewski สำหรับโปรแกรมเมอร์ Bartosz ยังสร้างชุดการบรรยายประกอบ
alx9r

30

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

  1. ประเภท Haskell กับวัตถุของหมวดหมู่
  2. เงื่อนไขของประเภทกับmorphisms (สังเกตสัญลักษณ์ที่คล้ายกัน)f : A BAB f:AB
  3. ประเภทข้อมูลเชิงพีชคณิตที่มีวัตถุเริ่มต้น
  4. การก่อสร้างงานประเภทที่มีfunctors
  5. ฯลฯ

รายการไปเรื่อยๆ แต่จุดสำคัญอย่างหนึ่งก็คือคุณสามารถกำหนดสิ่งต่าง ๆ เช่นmonadsและalgebrasในทฤษฎีหมวดหมู่และเกิดขึ้นกับความคิดที่เป็นประโยชน์ต่อนักคณิตศาสตร์ แต่ยังแพร่หลายในการฝึกเขียนโปรแกรม Haskell

ฉันไม่แน่ใจว่าหนังสือเล่มไหนที่จะแนะนำเนื่องจากฉันยังไม่พบหนังสือเกริ่นนำที่น่าพอใจในหมวดหมู่สำหรับนักวิทยาศาสตร์คอมพิวเตอร์ คุณสามารถลองหมวดหมู่ประเภทและโครงสร้างโดย Asperti และ Longo แนวคิดคือการเรียนรู้คำจำกัดความพื้นฐานจนถึงส่วนเสริมแล้วอาจลองและอ่านบล็อกยอดเยี่ยมบางส่วนเพื่อลองและเข้าใจแนวคิดเหล่านี้


1
"คิดเกี่ยวกับพัฒนาการที่เป็นประโยชน์ต่อนักคณิตศาสตร์ แต่ยังแพร่หลายในการฝึกฝนการเขียนโปรแกรม Haskell" - คุณสามารถยกตัวอย่างหรือจะต้องมีความรู้มาก่อนหรือไม่?
กราฟิลส์

7
@Raphael: Monads ลูกศร algebras Coalgebras
Dave Clarke

6
Functors, คู่หมวดหมู่ Kleisli ที่โยเนดะแทรก ...
cody

4
Cartesion ปิดหมวดหมู่ ความดีความชอบ
Dave Clarke

2
"การแนะนำทฤษฎีหมวดหมู่สำหรับวิศวกรซอฟต์แวร์", cs.toronto.edu/~sme/presentations/cat101.pdf
Vladimir Alexiev

29

Echoing @AJed คำแนะนำฉันแนะนำให้เปลี่ยนข้อความของคุณ

I want to learn category theory so I can become better at Haskell.

บนหัว: เรียนรู้ Haskell สร้างสัญชาตญาณการเขียนโปรแกรมของคุณ เมื่อคุณเป็นกูรู FP แล้วมันอาจจะง่ายกว่าที่จะรับทฤษฎีหมวดหมู่ (ถ้าคุณยังสนใจ)

หมวดหมู่ทฤษฎีนั้นง่ายสำหรับผู้ที่มีการศึกษาทางคณิตศาสตร์ในวงกว้าง (กลุ่ม, แหวน, โมดูล, ปริภูมิเวกเตอร์, โทโพโลยี ฯลฯ ) ขาดความเป็นมานี้ทฤษฎีหมวดหมู่ก็เกือบจะไม่ยอมรับ ความงามของทฤษฎีหมวดหมู่คือมันรวมสิ่งต่าง ๆ ที่ดูเหมือนไม่เกี่ยวข้องเป็นจำนวนมาก (เช่นสิ่งที่เหลือไว้ร่วมกับผู้ฟังที่หลงลืม ได้แก่ กลุ่มอิสระ, algebras ห่อหุ้มอเนกประสงค์, หินอัด - ซีค, การย่อกลุ่ม) แต่ถ้าคุณไม่คุ้นเคยกับตัวอย่างหลายอย่างที่ทฤษฎีหมวดหมู่รวมทฤษฎีหมวดหมู่เป็นเพียงชั้นเพิ่มเติมของความซับซ้อนที่ทำให้ชีวิตของคุณยากขึ้น

จากประสบการณ์ของฉันการเรียนรู้ทำได้ง่ายขึ้นโดยการสร้างสิ่งที่คนรู้อยู่แล้ว ในฐานะนักพัฒนาซอฟต์แวร์คุณรู้มากเกี่ยวกับการเขียนโปรแกรมและการเขียนโปรแกรม Haskell นั้นไม่แตกต่างจากการเขียนโปรแกรมอื่นดังนั้นคำแนะนำของฉันคือเข้าหา Haskell จากมุมมองการเขียนโปรแกรมเชิงปฏิบัติโดยไม่สนใจทฤษฎีหมวดหมู่ ทฤษฎีหมวดหมู่ที่อยู่ใน Haskell เช่นการสนับสนุน monads นั้นง่ายกว่าสำหรับโปรแกรมเมอร์ที่จะเข้าใจโดยไม่ต้องอ้อมผ่านทฤษฎีหมวดหมู่ ท้ายที่สุดแล้ว monads เป็นเพียงองค์ประกอบทั่วไป (และคุณจะได้ใช้ monads ในการฝึกเขียนโปรแกรมของคุณแล้ว - แม้ว่าคุณจะไม่รู้) และ Haskell ก็ไม่สนับสนุน monads ที่แท้จริงเพราะมันไม่ได้บังคับใช้กฎหมาย monadic


7
ไม่มีที่จะซื่อสัตย์ Haskell จริงๆคือที่ที่แตกต่างกันจากส่วนใหญ่การเขียนโปรแกรมภาษาอื่น ๆ ไปยังจุดที่ได้รับความคิดอุปาทานที่ผ่านมามักจะเป็นความท้าทายที่ยิ่งใหญ่ที่สุด นักพัฒนาซอฟต์แวร์ที่มีประสบการณ์ดูเหมือนจะมีปัญหามากกว่าคนที่ไม่เคยตั้งโปรแกรมมาก่อน
CA McCann

5
@CAMcCann ฉันยอมรับว่าบางโปรแกรมที่มีประสบการณ์ดูเหมือนจะมีช่วงเวลาที่ยากลำบากในการย้ายจาก Java หรือ C # ไปเป็น Haskell แต่ฉันไม่คิดว่าเป็นเพราะมีบางสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับ Haskell ฉันคิดว่ามันเป็นส่วนหนึ่งเพราะมันดูเหมือนจะแตกต่างกัน ความคิดที่คุณต้องเรียนรู้ทฤษฎีหมวดหมู่เพื่อชื่นชม Haskell อาจป้องกันไม่ให้นักพัฒนาซอฟต์แวร์ที่มีประสบการณ์ไม่กี่คนได้รับความเชี่ยวชาญจาก Haskell (เทียบกับทำไม F # ไม่มี monads) ฉันคิดว่ามันยากที่จะนึกถึงคุณลักษณะของ Haskell มากมายที่ไม่มีความคล้ายคลึงในภาษาอื่น
Martin Berger

5
การรู้ทฤษฎีหมวดหมู่อาจช่วยได้เล็กน้อย แต่ไม่มากนักและการเรียนรู้มันยากกว่าการเรียนรู้ Haskell มีความแตกต่างพื้นฐานค่อนข้างมากเมื่อเทียบกับภาษาส่วนใหญ่ (ความบริสุทธิ์การประเมินที่ไม่เข้มงวดระบบประเภท) และการลบคำศัพท์ CT ทั้งหมดไม่ทำให้สิ่งเหล่านี้คุ้นเคย บนมืออื่น ๆ , การเรียนรู้ Haskell กระตุ้นให้คนบางคนที่จะเรียนรู้ CT บางเพราะความคิดที่ยืมเป็นประโยชน์ ระบบประเภทที่ จำกัด ของ F # และการหลีกเลี่ยงคำศัพท์ที่มีอยู่ในปัจจุบันที่ดีอย่างสมบูรณ์แบบนั้นเป็นข้อบกพร่องไม่ใช่คุณสมบัติ
CA McCann

1
ฉันไม่รู้ภาษาอื่นนอกจาก Scala ด้วยระบบการพิมพ์ที่เทียบได้กับ Haskell จริงๆ จากการสังเกตเชิงประจักษ์ความบริสุทธิ์จะไม่ถูกเข้าใจในทันทีและการประเมินที่ไม่เข้มงวด (ซึ่งคุณข้ามไป) ก็ยิ่งยากขึ้น สุดท้ายผมรู้สึกเป็นโปรแกรมเมอร์ที่ทำงานและฉันโต้แย้งว่าทุกคนในสนามจะถูกข่มขู่โดยชื่อ อุตสาหกรรมการพัฒนาซอฟต์แวร์เต็มไปด้วยศัพท์แสงที่ทึบอยู่แล้ว นอกจากนี้ระบบชนิดของ F # ไม่สามารถแสดงออกถึง Monads ได้โดยตรงนิพจน์การคำนวณไม่ใช่ชั้นหนึ่งซึ่ง จำกัด การใช้งานอย่างมีนัยสำคัญ
CA McCann

2
CBN นั้นง่ายเช่นกันโดยการเปรียบเทียบกับ thunking แนวคิดที่โปรแกรมเมอร์ส่วนใหญ่จะใช้ก่อนหน้านี้ ความบริสุทธิ์เป็นสิ่งที่โปรแกรมเมอร์ทุกคนเข้าใจ Haskell ใช้ในการศึกษาระดับปริญญาตรีในสหราชอาณาจักร เมื่อนักเรียนของฉันถามฉันเกี่ยวกับวิธีการเขียนโปรแกรมเชิงฟังก์ชั่นฉันมักจะแนะนำให้เรียน Haskell ก่อน แต่นักเรียนจะถูกข่มขู่ด้วยชื่อเสียงของมันเช่นเดียวกับผู้สร้างคำถาม ฉันเชื่อว่าเหตุผลหลักสำหรับเรื่องนี้คือความสัมพันธ์ของ Haskell กับทฤษฎีหมวดหมู่
Martin Berger

13

คำตอบสั้น ๆ : ไม่ [แต่นี่เป็นเพียงความคิดเห็น]

อย่าไปที่หมวดหมู่ทฤษฎีหรือโดเมนเชิงทฤษฎีอื่น ๆ ที่จะกลายเป็นดีใน Haskell เรียนรู้เทคนิคการเขียนโปรแกรมที่ใช้งานได้เช่นการเรียกซ้ำหางแผนที่ย่อและอื่น ๆ อ่านรหัสให้มากที่สุด ใช้ความคิดให้มากที่สุดเท่าที่จะทำได้ หากคุณมีปัญหาให้อ่านและอ่าน

หากคุณต้องการการอ้างอิงเชิงทฤษฎีที่ดีในการเรียนรู้ Haskell และกระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชั่นอื่น ๆ ให้ดูที่: ข้อมูลเบื้องต้นเกี่ยวกับการเขียนโปรแกรมการทำงานผ่านแลมบ์ดาแคลคูลัส, Greg Michaelson (ออนไลน์) ... มีหนังสืออื่นที่คล้ายคลึงกันอยู่


1
ฉันยกคิ้วขึ้นที่นี้เพราะ "การเรียกซ้ำหาง" มักจะไม่สำคัญกับการเขียนโปรแกรมใน Haskell เนื่องจากความเกียจคร้าน อย่างไรก็ตาม "เรียนรู้ด้วยการทำ" เป็นคำแนะนำที่ดีเกือบทุกครั้ง
Dan Burton

@DanBurton .. การสังเกตที่น่าสนใจ สมมติว่าแทนที่จะเป็น Haskell ให้เรียนรู้ erlang หรือแบบแผน :) [ฉันไม่ได้เป็นผู้เชี่ยวชาญใน Haskell ฉันเพิ่งเลือกเพราะฟังดูดี]
AJed


0

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

โดยวิธีการที่ผมขอแนะนำให้เป็นจุดเริ่มต้นที่ดีมากสำหรับวัตถุประสงค์ของคุณจะเป็นที่นี่


สิ่งนี้ไม่ได้ตอบคำถาม: มันมีประโยชน์สำหรับการเรียนรู้การเขียนโปรแกรมการทำงานหรือไม่ หัวข้อใดในทฤษฎีหมวดหมู่ที่มีประโยชน์สำหรับ Haskell
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.