คำถามติดแท็ก functional-programming

ฟังก์ชั่นการเขียนโปรแกรมเป็นกระบวนทัศน์การเขียนโปรแกรมซึ่งส่วนใหญ่ใช้ฟังก์ชั่นเป็นวิธีการในการสร้าง abstractions และแสดงการคำนวณที่ประกอบด้วยโปรแกรมคอมพิวเตอร์

1
การอนุมานแบบอิงข้อ จำกัด พร้อมข้อมูลพีชคณิต
ฉันกำลังทำงานกับภาษาที่ใช้แสดงออกของลำดับวงศ์ตระกูล ML ดังนั้นจึงจำเป็นต้องมีการอนุมานแบบตามธรรมชาติ> :) ตอนนี้ฉันกำลังพยายามที่จะขยายการแก้ปัญหาตามข้อ จำกัด ไปสู่ปัญหาประเภทอนุมานตามการใช้งานง่าย ๆ ใน EOPL (Friedman และ Wand) แต่พวกเขามีประเภทข้อมูลพีชคณิตขั้นตอนที่สวยงาม สิ่งที่ฉันมีจนถึงตอนนี้ทำงานได้อย่างราบรื่น; ถ้าการแสดงออกeคือa + b, e : Int, และa : Int b : Intถ้าeเป็นการแข่งขัน match n with | 0 -> 1 | n' -> n' * fac(n - 1)`, ฉันถูกต้องสามารถอนุมานได้ว่าt(e) = t(the whole match expression), t(n) = …

1
ตัวอย่างที่กระชับของต้นทุนชี้แจงของการอนุมานประเภท ML
ฉันทราบว่าค่าใช้จ่ายของการอนุมานประเภทในภาษาที่ใช้งานได้เช่น OCaml อาจสูงมาก การอ้างสิทธิ์คือมีลำดับของนิพจน์เช่นนั้นสำหรับแต่ละนิพจน์ความยาวของประเภทที่สอดคล้องกันนั้นจะเป็นเลขชี้กำลังบนความยาวของนิพจน์ ฉันกำหนดลำดับด้านล่าง คำถามของฉันคือ: คุณรู้จักลำดับที่มีนิพจน์ที่กระชับกว่าซึ่งประสบความสำเร็จในประเภทเดียวกันหรือไม่? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a …

4
เทคนิคทางการทั่วไปสำหรับการพิสูจน์รหัสฟังก์ชั่นที่ถูกต้องคืออะไร?
ฉันต้องการแสดงหลักฐานสำหรับส่วนของโปรแกรม Haskell ที่ฉันเขียนเป็นส่วนหนึ่งของวิทยานิพนธ์ของฉัน ถึงตอนนี้ฉันไม่สามารถหางานอ้างอิงที่ดีได้ การเขียนโปรแกรมเบื้องต้นเกี่ยวกับหนังสือของ Graham Hutton ใน Haskell ( Google Books ) - ซึ่งฉันอ่านขณะเรียนรู้ Haskell— สัมผัสกับเทคนิคสองสามประการสำหรับการให้เหตุผลเกี่ยวกับโปรแกรมเช่น การใช้เหตุผลเชิงสมการ ใช้รูปแบบที่ไม่ทับซ้อนกัน รายการเหนี่ยวนำ ในบทที่ 13 แต่มันไม่เชิงลึกมาก มีหนังสือหรือบทความใดบ้างที่คุณสามารถแนะนำซึ่งให้ภาพรวมรายละเอียดเพิ่มเติมของเทคนิคการพิสูจน์อย่างเป็นทางการสำหรับ Haskell หรือรหัสการทำงานอื่น ๆ

2
มีกระบวนทัศน์สำหรับการเขียนฟังก์ชั่น“ การอัพเดทที่เพิ่มขึ้น” ในสไตล์ดาต้าโฟลที่แท้จริงหรือไม่?
ฉันไม่รู้คำศัพท์ที่ถูกต้องสำหรับการถามคำถามนี้ดังนั้นฉันจะอธิบายด้วยคำจำนวนมากแทนอดทนกับฉัน พื้นหลังดังนั้นเราจึงอยู่ในหน้าเดียวกัน: โปรแกรมมักจะมีแคช - การแลกเปลี่ยนเวลา / หน่วยความจำ ความผิดพลาดของโปรแกรมเมอร์ทั่วไปคือการลืมปรับปรุงค่าแคชหลังจากเปลี่ยนหนึ่งในแหล่งข้อมูลต้นกำเนิด / ทำนอง แต่กระบวนทัศน์การเขียนโปรแกรม dataflow หรือ FRP นั้นเป็นภูมิคุ้มกันต่อความผิดพลาดดังกล่าว หากเรามีฟังก์ชั่นบริสุทธิ์จำนวนมากและเชื่อมต่อเข้าด้วยกันในกราฟอ้างอิงโดยตรงจากนั้นโหนดสามารถมีค่าเอาต์พุตแคชและนำกลับมาใช้ใหม่ได้จนกว่าอินพุตใด ๆ ของฟังก์ชั่นจะเปลี่ยนไป สถาปัตยกรรมระบบนี้อธิบายไว้ในเอกสารการแคชในสภาพแวดล้อมที่ใช้ดาต้าโฟลว์และในภาษาที่จำเป็นต้องมีความคล้ายคลึงกับการบันทึกข้อมูลมากหรือน้อย ปัญหา : เมื่อหนึ่งในอินพุตของฟังก์ชั่นเปลี่ยนแปลงเรายังคงต้องใช้งานฟังก์ชั่นโดยรวมแล้วทิ้งเอาต์พุตแคชและคำนวณใหม่อีกครั้งตั้งแต่เริ่มต้น ในหลายกรณีดูเหมือนว่าจะสิ้นเปลืองสำหรับฉัน ลองพิจารณาตัวอย่างง่ายๆที่สร้างรายการ "5 อันดับแรก" ข้อมูลอินพุตเป็นรายการที่ไม่เรียงลำดับของอะไรก็ตาม มันถูกส่งผ่านเป็นอินพุตไปยังฟังก์ชันที่เอาต์พุตรายการที่เรียงลำดับ ซึ่งในทางกลับกันจะมีการป้อนฟังก์ชั่นที่ใช้ 5 รายการแรกเท่านั้น ใน pseudocode: input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45] intermediate = sort(input) final_output = …

1
ประเภทตนเองทำให้แคลคูลัสของการสร้างอุปนัยล้าสมัยหรือไม่?
ประเภทตัวเองเป็นส่วนขยายของแคลคูลัสของการก่อสร้าง [1] ที่อนุญาตให้ภาษาในการแสดงประเภทข้อมูลเกี่ยวกับพีชคณิตเข้ารหัสผ่านการเข้ารหัสสก็อต Scott Encoding ให้ความสามารถในการจับคู่รูปแบบO(1)ซึ่งเป็นหนึ่งในแรงจูงใจหลักสำหรับการรวมคำจำกัดความอุปนัยไว้ใน CC แต่ประเภทของตัวเองถูกสร้างขึ้นมาเพื่อทฤษฎีพื้นฐานที่เรียบง่ายและสง่างามมากและดูเหมือนจะไม่ทรงพลังเลย ประเภทตนเองภายใต้มุมมองทางทฤษฎีทำให้ CIC ล้าสมัยหรือยังมีแง่มุมใดบ้างที่ CIC นั้นเป็นที่ชื่นชอบในความสัมพันธ์กับ Self Tyes? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf

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

1
cal -culculus: ประสิทธิภาพสูงสุดในการแสดงฟังก์ชั่นหน่วยความจำคืออะไร?
ฉันต้องการเปรียบเทียบประสิทธิภาพของฟังก์ชั่นเข้ารหัส (Church's / Scott's) เทียบกับโครงสร้างข้อมูลที่เข้ารหัสคลาสสิก (แอสเซมเบลอร์ / C) แต่ก่อนที่ฉันจะทำสิ่งนั้นฉันต้องรู้ว่าประสิทธิภาพ / สามารถเป็นตัวแทนของฟังก์ชันในหน่วยความจำได้อย่างไร ฟังก์ชั่นนี้สามารถใช้งานได้บางส่วน (ปิดหรือที่รู้จัก) ฉันสนใจทั้งอัลกอริธึมการเข้ารหัสปัจจุบันภาษาการใช้งานที่ได้รับความนิยม (Haskell, ML) ใช้และในภาษาที่มีประสิทธิภาพที่สุดที่สามารถทำได้ จุดโบนัส: มีการเข้ารหัสดังกล่าวว่าแผนที่ฟังก์ชั่นการเข้ารหัสจำนวนเต็มจำนวนเต็มพื้นเมือง ( short, intฯลฯ ใน C) เป็นไปได้ไหม ฉันให้ความสำคัญกับประสิทธิภาพตามประสิทธิภาพ กล่าวอีกอย่างหนึ่งก็คือยิ่งการเข้ารหัสมีประสิทธิภาพน้อยลงก็มีผลต่อประสิทธิภาพการคำนวณด้วยโครงสร้างข้อมูลที่ใช้งานได้

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

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

3
ความไม่เปลี่ยนแปลงในการเขียนโปรแกรมเชิงฟังก์ชั่นมีอยู่จริงหรือไม่?
แม้ว่าฉันจะทำงานเป็นโปรแกรมเมอร์ในชีวิตประจำวันของฉันและใช้ภาษายอดนิยมทั้งหมด (Python, Java, C, ฯลฯ ) ฉันยังไม่มีมุมมองที่ชัดเจนเกี่ยวกับการเขียนโปรแกรมที่ใช้งานได้ จากสิ่งที่ผมได้อ่านหนึ่งทรัพย์สินของภาษาหน้าที่คือว่าโครงสร้างข้อมูลจะไม่เปลี่ยนรูป สำหรับฉันคนเดียวนี่ทำให้เกิดคำถามมากมาย แต่ก่อนอื่นฉันจะเขียนสิ่งที่ฉันเข้าใจเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้และถ้าฉันผิดฉันรู้สึกอิสระที่จะแก้ไขให้ถูกต้อง ความเข้าใจของฉันเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้: เมื่อโปรแกรมเริ่มทำงานจะมีโครงสร้างข้อมูลคงที่พร้อมข้อมูลคงที่ ไม่มีใครสามารถเพิ่มข้อมูลใหม่ให้กับโครงสร้างเหล่านี้ ไม่มีตัวแปรในรหัส คุณสามารถ "คัดลอก" จากข้อมูลที่มีอยู่แล้วหรือข้อมูลที่คำนวณได้ในปัจจุบัน เนื่องจากทั้งหมดข้างต้นการเปลี่ยนแปลงไม่ได้เพิ่มความซับซ้อนของพื้นที่ขนาดใหญ่ให้กับโปรแกรม คำถามของฉัน: หากโครงสร้างข้อมูลควรจะยังคงเหมือนเดิม (ไม่เปลี่ยนรูป) จะมีคนเพิ่มรายการใหม่ในรายการได้อย่างไร อะไรคือจุดที่มีโปรแกรมที่ไม่สามารถรับข้อมูลใหม่ได้? สมมติว่าคุณมีเซ็นเซอร์ติดอยู่กับคอมพิวเตอร์ของคุณที่ต้องการป้อนข้อมูลเข้าสู่โปรแกรม นั่นหมายความว่าเราไม่สามารถจัดเก็บข้อมูลขาเข้าได้ทุกที่หรือไม่ การเขียนโปรแกรมใช้งานได้ดีสำหรับการเรียนรู้ของเครื่องอย่างไร เนื่องจากการเรียนรู้ของเครื่องสร้างขึ้นจากสมมติฐานของการปรับปรุง "การรับรู้" ของสิ่งต่าง ๆ - จึงเก็บข้อมูลใหม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.