คำติชมของ OCaml: มันยังใช้ได้หรือไม่


15

ฉันเป็นมือใหม่อย่างสมบูรณ์กับ OCaml ฉันเพิ่งเข้ามาในหน้านี้ซึ่งแสดงให้เห็นถึงการวิพากษ์วิจารณ์ที่ดีต่อ OCaml

เห็นไหมว่าหน้ามันค่อนข้างเก่า (2550): จุดใดที่แสดงรายการสัญลักษณ์วันนี้ยังคงเป็นจริง ตัวอย่างเช่น: มันยังคงเป็นจริงหรือไม่ที่จะพิมพ์วัตถุทั่วไป?

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


5
ฉันลงคะแนนให้ปิดคำถามนี้เป็นแบบปิดหัวข้อเพราะmeta.programmers.stackexchange.com/questions/6417/…
ฟิลิปป์

3
มีทางแยกที่อาจได้รับการแก้ไขคือ: tryfsharp.org
Den

7
แน่นอนว่าความคิดเห็นในบทความที่คุณเชื่อมโยงนั้นถูกต้อง แต่การวิจารณ์เหล่านี้เกี่ยวข้องกับคุณหรือไม่นั้นเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง โปรดทราบว่าผู้เขียนมาจากพื้นหลัง Lisp ทั่วไปและดังนั้นจึงมีค่า Lispish หากคุณใช้วิธีอื่นในการ OCaml มากกว่าการเปรียบเทียบกับ Lisp (เช่น“ OCaml คือ Haskell สำหรับมนุษย์ทั่วไป” หรือ“ ถ้า C เป็นภาษาที่ใช้งานได้คุณจะมี OCaml”) คุณจะพบว่ามันน่าพอใจมากกว่า สำหรับข้อบกพร่องทั้งหมดของ OCaml เป็นภาษาที่ยอดเยี่ยมและฉันขอแนะนำให้คุณตะลุยมัน
amon

5
เท่าที่ฉันรู้ไม่มีวิธีการตรวจสอบจำนวนเต็มล้นในฮาร์ดแวร์ดังนั้นคุณจะต้องแทรกการตรวจสอบรันไทม์ทั่วสถานที่เพื่อตรวจสอบ; แต่ผู้เขียนออกโดยใช้ "bignum" บนพื้นฐานของประสิทธิภาพ! การร้องเรียนเกี่ยวกับจำนวนการพิมพ์แบบคงที่ในการบอกว่าคาดเข็มขัดนิรภัยไม่ดีเพราะคุณอาจคิดว่าคุณไม่สามารถตายได้ในอุบัติเหตุรถยนต์ ข้อร้องเรียนเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้ของโมดูลกำลังบอกว่าเขาต้องการที่จะจับสิ่งต่าง ๆ - การต่อต้านแบบแยกส่วนและการปฏิบัติที่ผิดพลาดได้ง่าย "สวนสัตว์ประเภทเล็ก" ไม่มีส่วนเกี่ยวข้องกับการอนุมานประเภท เป็นที่ชัดเจนว่าอคติของเขาอยู่ที่ไหน
Doval

2
@Doval: แน่นอนคุณสามารถตรวจจับล้นในฮาร์ดแวร์ อย่างไรก็ตามการจัดการกับมันเป็นเรื่องซอฟต์แวร์
Mason Wheeler

คำตอบ:


13

บทความนี้มีการกล่าวถึงในหลาย ๆ ที่:

เพื่อสรุป: ใช่ OCaml ไม่ใช่เสียงกระเพื่อมและไม่ใช่มันไม่สมบูรณ์แบบ (หมายความว่าอย่างไร) ฉันไม่คิดว่าประเด็นที่กล่าวถึงในโพสต์บล็อกมีความเกี่ยวข้องกับโปรแกรมเมอร์ O'Caml แบบวันต่อวัน

เมื่อเรียน O'Caml ฉันคิดว่ามันเป็นภาษาที่น่าสนใจซึ่งสามารถช่วยคุณสร้างโปรแกรมที่คุณไม่กล้าเขียนพูดเช่น C / C ++ / Java: ยกตัวอย่างเช่นลองดูที่ Frama-Cม่า-C

สำหรับคำอธิบายที่ทันสมัยของ O'Caml ฉันขอแนะนำให้คุณอ่านเกี่ยวกับคุณสมบัติของภาษา: ภาษานั้นส่งเสริมเทคนิคการตรวจสอบประเภทสแตติกที่แข็งแกร่งซึ่งช่วยให้การใช้งานมุ่งเน้นไปที่การผลิตนักแสดง แต่ปลอดภัยเวลาทำงาน

สำคัญ : ฉันไม่ใช่ผู้เชี่ยวชาญ OCaml: หากคุณเป็นหนึ่งในพวกเขาและเห็นว่าฉันเขียนอะไรผิดพลาดอย่างรุนแรงโปรดแก้ไขให้ถูกต้อง ฉันจะแก้ไขโพสต์นี้ตามลำดับ

การตรวจสอบประเภทคงที่

  • ความรู้สึกผิดของการรักษาความปลอดภัย

    นี่เป็นเรื่องจริง แต่ชัดเจน

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

    นั่นคือเมื่อสามารถใช้เทคนิคการตรวจสอบแบบไดนามิก: คอมไพเลอร์ OCaml มีแฟล็กเพื่อสร้างไฟล์เรียกทำงานที่มีข้อมูลการดีบักและอื่น ๆ ... หรือมันสามารถสร้างรหัสที่สุ่มเชื่อถือโปรแกรมเมอร์และลบข้อมูลประเภทมากที่สุด โปรแกรมเมอร์ที่ต้องการโปรแกรมที่มีประสิทธิภาพควรใช้การตรวจสอบแบบไดนามิกอย่างชัดเจน

    สิ่งเดียวกันนี้ใช้กับ Common LISP แต่กลับรายการ: ไดนามิกประเภทแรกด้วยการประกาศประเภทที่เป็นตัวเลือกและคำสั่งคอมไพเลอร์ลำดับที่สอง

  • ประเภทพื้นฐานไม่กี่

    ยังคงใช้งาน: ภาษาหลักไม่เปลี่ยนแปลง (หรือไม่มาก)

  • Silent Integer Overflow

    นี่เป็นบรรทัดฐานในภาษาส่วนใหญ่ที่มีการตรวจสอบจำนวนเต็มล้นด้วยมือ ฉันไม่ทราบว่ามีไลบรารีใดที่จะตรวจสอบการดำเนินการเพื่อตรวจสอบว่ามีการล้นหรือไม่

  • โมดูลไม่เปลี่ยนแปลง

    1. ผู้เขียนกล่าวถึงผู้ชำนาญการ แต่ไม่สามารถดูตัวอย่างของเขาที่ไม่สามารถนำไปใช้ได้ การอ่านบทที่เฟิร์สคลาสโมดูลของhttps://realworldocaml.orgดูเหมือนว่าโมดูลนั้นสามารถใช้ในการเขียนและสร้างโมดูลใหม่ได้ แน่นอนว่าการปรับเปลี่ยนโมดูลที่มีอยู่นั้นต้องการการแก้ไขซอร์สโค้ด แต่ก็ไม่ได้ผิดปกติสำหรับภาษาการเขียนโปรแกรม

    2. " ความหมายฟังก์ชั่นจะถูกรวบรวม INLINE"

    เธรด Reddit ข้างต้นไม่เห็นด้วยบอกว่าการผูกจะได้รับการแก้ไขในเวลาลิงก์ อย่างไรก็ตามนี่คือรายละเอียดการใช้งานและฉันคิดว่าการเน้นความหมายเกี่ยวข้องกับวิธีการแก้ไขฟังก์ชั่น ตัวอย่าง:

     let f x y = x + y ;;
     let g a b = f b a ;;
     let f x y = x * y ;;
     exit (g 2 3) ;;
    

    คอมไพล์โปรแกรมข้างต้นและเมื่อดำเนินการผลตอบแทน 5 เพราะgถูกกำหนดให้กับรุ่นแรกของfเพียงแค่เป็นถ้าฟังก์ชั่นการโทรginlined fการเรียกร้องให้ นี่ไม่ใช่ "ไม่ดี" โดยวิธีการมันเป็นเพียงสอดคล้องกับกฎการแชโดว์ของชื่อ O'Caml

    เพื่อสรุป : ใช่, โมดูลไม่เปลี่ยนรูป แต่พวกเขายังcomposable

  • ความแตกต่างทำให้เกิดข้อผิดพลาดชนิดรันไทม์

    ฉันไม่สามารถทำซ้ำข้อผิดพลาดดังกล่าว ฉันสงสัยว่าเป็นข้อผิดพลาดของคอมไพเลอร์

ไม่มีมาโคร

แน่นอนไม่มีมาโคร แต่ตัวประมวลผลล่วงหน้า (OcamlP4, OcamlP5, ... )

  • Wrappers (with-open-file)

    การรู้ว่าการป้องกันการใช้ประโยชน์นั้นมีประโยชน์อย่างไรนี่เป็นความเจ็บปวดอย่างแน่นอนที่เห็นว่าไม่มีอยู่ในหลายภาษา นี่คือตัวเลือกบางส่วน:

    1. ปรับปรุงการจัดการข้อยกเว้นใน OCaml
    2. ขยาย OCaml ไวยากรณ์
  • สถานที่

    ฉันไม่คิดว่ามีการอ้างอิงทั่วไปใน OCaml

ภาษารองลงไป

  • บันทึกชื่อฟิลด์นรก

    จริง แต่คุณควรใช้โมดูล:

    1. สองเขตข้อมูลของสองระเบียนมีป้ายกำกับเดียวกันใน OCaml
    2. การแก้ไขชื่อฟิลด์
  • วากยสัมพันธ์

    ยังคงใช้ (แต่จริงๆแล้วนี่เป็นเพียงไวยากรณ์)

  • ไม่มีความแตกต่าง

    ยังคงใช้ แต่อย่างใดมีคนที่ชอบที่แทนที่จะเป็นหอคอยตัวเลข Lisp (ฉันไม่รู้ว่าทำไม) ฉันคิดว่ามันช่วยด้วยการอนุมานประเภท

  • ชุดฟังก์ชันที่ไม่สอดคล้องกัน

    ดูโครงการรวมแบตเตอรี่ OCaml โดยเฉพาะอย่างยิ่ง BatArrayสำหรับตัวอย่างของmap2อาร์เรย์

  • ไม่มีตัวแปรแบบไดนามิก

    สามารถดำเนินการได้:

    1. http://okmij.org/ftp/ML/dynvar.txt
    2. http://okmij.org/ftp/ML/index.html#dynvar
  • อาร์กิวเมนต์ ~ ทางเลือกดูด

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

  • แอปพลิเคชันอาร์กิวเมนต์บางส่วนไม่สอดคล้องกัน

    ฉันไม่คิดว่ามันเป็นเรื่องที่น่ารำคาญในทางปฏิบัติ

  • ความสามารถในการอ่านของเลขคณิต

    มันถือ แต่คุณสามารถใช้ R หรือ Python สำหรับปัญหาเชิงตัวเลขหากคุณต้องการ

  • การแก้ไขข้อขัดแย้งของชื่อเงียบ

    ยังคงมีผลบังคับใช้ แต่โปรดทราบว่านี่เป็นเอกสารที่ดี

  • ไม่มีวัตถุอินพุต / เอาต์พุต

    ยังคงใช้

การใช้งานห้องสมุด

สิ่งเหล่านี้เปลี่ยนแปลงอยู่ตลอดเวลา: ไม่มีคำตอบที่ชัดเจน

สุดท้าย

"คุณควรลอง OCaml (หรือดีกว่า, Haskell) แม้ว่าคุณจะคิดว่ามันแย่มากและคุณไม่ได้วางแผนที่จะใช้มันหากไม่มีการศึกษาด้านวิทยาศาสตร์คอมพิวเตอร์ของคุณก็ไม่สมบูรณ์เหมือนขาดความสมบูรณ์โดยไม่มี Lisp และ C (หรือ การเปิดรับแสงที่ดีขึ้น

... ยังคงใช้


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

@ Andrea ฉันแก้ไขคำตอบของฉัน
coredump

1
"... มีคนที่ชอบแบบนั้นแทนที่จะเป็นหอคอยตัวเลขของ Lisp (ฉันไม่รู้ว่าทำไม) ฉันคิดว่ามันช่วยได้ด้วยการอนุมานแบบ" การเล่นชนิดหนึ่ง ระบบชนิดของ SML และ OCaml ต้องการให้ทุกนิพจน์มีเพียงประเภทเดียว การใช้งานตัวดำเนินการทางคณิตศาสตร์มากเกินไปของ SML เป็นข้อยกเว้นที่สร้างขึ้นในภาษา นี่เป็นความจริงของ Haskell เช่นกัน การเปิดใช้งานการโหลดมากเกินไปนั้นเป็นแรงจูงใจเบื้องหลังคลาสของประเภท การจับคือคุณสามารถมีอินสแตนซ์คลาสประเภทเดียวเท่านั้นต่อชนิด นอกจากนี้คุณยังไม่สามารถแปลงจำนวนเต็มเป็นทศนิยมที่มีขนาดเท่ากันไม่ได้ - การลอย 64- บิตมีความแม่นยำเพียง 54 บิต
Doval

@Doval แล้วการพิมพ์ Typing Towerสำหรับ Racket ล่ะ? เราสามารถจินตนาการไลบรารี OCaml ที่จะใช้ประโยชน์จากคลาสประเภทหรือ Generalized Algebraic Data Types (GADT) เพื่อให้ตัวดำเนินการทางคณิตศาสตร์แบบ polymorphic ได้หรือไม่? เกี่ยวกับการแปลง: ไม่ใช่การดำเนินการทั้งหมดที่เป็นไปได้ แต่มีบางอย่างและสามารถพิมพ์ได้
coredump

2
@Doval: "Re: ตัวดำเนินการทางคณิตศาสตร์แบบ polymorphic ฉันไม่คิดว่าจะมีวิธีการใดถ้าไม่ใช้คลาสประเภทของ Haskell" F # มีตัวดำเนินการทางคณิตศาสตร์แบบ polymorphic ที่ไม่มีคลาสชนิด
Jon Harrop

7

เห็นไหมว่าหน้ามันค่อนข้างเก่า (2550): จุดใดที่แสดงรายการสัญลักษณ์วันนี้ยังคงเป็นจริง

  • ความผิดพลาดของการรักษาความปลอดภัย นี่เป็นเรื่องไร้สาระ

  • ไม่กี่ประเภทพื้นฐาน ตอนนี้ OCaml มีอาร์เรย์ไบต์และไบต์ แต่ไม่มีสตริง Unicode ในตัว, จำนวนเต็ม 16 บิต, จำนวนเต็มที่ไม่ได้ลงชื่อ, ลอย 32 บิต, เวกเตอร์หรือเมทริกซ์ ห้องสมุดบุคคลที่สามให้บริการบางส่วน

  • เงียบจำนวนเต็มล้น ไม่เปลี่ยนแปลง แต่ไม่เคยมีปัญหา

  • โมดูล Immutability คำแนะนำของเขาที่ควรเปลี่ยนฟังก์ชั่นและโมดูลนั้นเป็นเรื่องที่น่ากลัวอย่างมากสำหรับ Lisp และเป็นความคิดที่แย่มาก คุณสามารถแทนที่โมดูลที่ใช้includeถ้าคุณต้องการ แต่คุณไม่สามารถกลายพันธุ์โมดูลได้

  • polymorphism สาเหตุขณะเรียกใช้ข้อผิดพลาดประเภท นี่เป็นปัญหาใหญ่ของ OCaml และยังไม่ได้รับการแก้ไข เมื่อประเภทของคุณพัฒนาความเท่าเทียมกันของ polymorphic การเปรียบเทียบและการแฮชจะเริ่มล้มเหลวเมื่อพบประเภทเช่นฟังก์ชั่นและการแก้จุดบกพร่องปัญหานั้นยากมาก F # มีทางออกที่ดีสำหรับปัญหานี้

  • ไม่มีมาโคร แดกดันเมื่อเขาเขียน OCaml นี้จริง ๆ แล้วได้รับการสนับสนุนอย่างเต็มที่สำหรับแมโคร แต่ตอนนี้พวกเขาได้ตัดสินใจที่จะดึงคุณลักษณะออกมา

  • ห่อ นี่เป็นปัญหาจริงและยังไม่ได้รับการแก้ไข ยังไม่มีtry ... finallyโครงสร้างในภาษา OCaml และไม่มี wrapper ที่ใช้ใน stdlib

  • สถานที่ ไม่เปลี่ยนแปลง แต่ไม่ใช่ปัญหา

  • ข้อมูลบันทึกนรกตั้งชื่อ จัดโครงสร้างรหัสของคุณอย่างถูกต้องโดยใช้โมดูล

  • วากยสัมพันธ์ ไม่เปลี่ยนแปลง แต่ไม่ใช่ปัญหา

  • ไม่มีความแตกต่าง นี่เป็นเรื่องไร้สาระส่วนใหญ่เมื่อเขาเขียนและไม่มีอะไรเปลี่ยนแปลง

  • ชุดฟังก์ชั่นที่ไม่สอดคล้องกัน OCaml ยังไม่มีconsฟังก์ชั่น ไม่เป็นไร. ฉันไม่ต้องการเสียงกระเพื่อมในภาษาของฉันขอบคุณ

  • ไม่มีตัวแปรแบบไดนามิก เป็นสิ่งที่ดีเกี่ยวกับ OCaml ยังคงเป็นสิ่งที่ดีเกี่ยวกับ OCaml

  • ตัวเลือก ~ ข้อโต้แย้งดูด อาร์กิวเมนต์ตัวเลือกหิน ฉันทำให้ไมโครซอฟท์พาพวกเขาไปเพิ่มอาร์กิวเมนต์ที่เป็นตัวเลือกใน F #

  • ข้อโต้แย้งบางส่วนที่ไม่สอดคล้องกันแอพลิเคชัน ใช่มั้ย?

  • การอ่านเลขคณิตของ สิ่งนี้เปลี่ยนไปตั้งแต่ฉันหยุดใช้ OCaml ~ 8 ปีที่แล้ว Int64.((q * n - s * s) / (n - 1L))เห็นได้ชัดว่าตอนนี้คุณสามารถทำ

  • แก้ปัญหาความขัดแย้งชื่อเงียบ เขาพยายามที่จะทำการพัฒนาซอฟต์แวร์เต็มรูปแบบใน REPL ตามที่คุณต้องการใน LISP อย่าทำอย่างนั้นใน OCaml ใช้ไฟล์และการรวบรวมแบทช์โดยใช้ REPL สำหรับการทดสอบรันโค้ดแบบใช้ครั้งเดียวและการคำนวณทางเทคนิคเชิงโต้ตอบเท่านั้น

  • การสั่งซื้อของการประเมินผล สิ่งนี้ผิดเมื่อเขาเขียน ลำดับของการประเมินผลไม่ได้กำหนดไว้ใน OCaml

  • ไม่มีการป้อนข้อมูลวัตถุ / ส่งออก เขาอ้างถึงห้องสมุดบุคคลที่สามซึ่งได้แก้ไขปัญหานี้แล้ว

  • คอมไพเลอร์หยุดหลังจากข้อผิดพลาดแรก ใช่มั้ย?

  • ไม่มีการติดตามสแต็กสำหรับไฟล์เรียกทำงานที่คอมไพล์แล้ว แก้ไขแล้ว.

  • ดีบักเกอร์ครับ ฉันไม่เคยใช้ดีบักเกอร์ การตรวจสอบประเภทคงที่จับข้อบกพร่องของฉันเกือบทั้งหมด

  • GC ครับ ฉันพบว่า GC ของ OCaml นั้นยอดเยี่ยมยกเว้นปัญหาสำคัญอย่างหนึ่ง: การล็อกส่วนกลางป้องกันการเขียนโปรแกรมแบบขนาน

  • ไม่มีการประกาศไปข้างหน้าโดยปริยาย การเรียกซ้ำร่วมกันนั้นชัดเจนโดยการออกแบบใน ML ทั้งหมด ความผิดปกติเท่านั้นคือtypeคำจำกัดความที่เรียกซ้ำโดยค่าเริ่มต้นในขณะที่letการผูกจะไม่ซ้ำโดยค่าเริ่มต้น

  • รอบที่ฟังก์ชั่นจะขาด OCaml ยังคงมีกระดูกเปลือยอยู่ แต่ห้องสมุดของบุคคลที่สามอย่าง Jane St's Core ให้roundและเพื่อน ๆ

  • รายการ List.mapยังคงไม่ซ้ำแบบเรียกซ้ำ ฉันส่งแพตช์เพื่อแก้ไขข้อบกพร่องที่ร้ายแรงเช่นนี้และต้องรอหลายปีก่อนที่มันจะปรากฏในรุ่น รายการยังคงไม่เปลี่ยนรูปแน่นอน และดังนั้นพวกเขาควรจะเป็น

  • ความเร็ว ฉันเชื่อว่าเวลาคอมไพล์สำหรับตัวแปร polymorphic ขนาดใหญ่ได้รับการแก้ไขแล้ว

  • จับคู่รูปแบบ ชัยชนะแห่งความหวังเหนือความเป็นจริง ชุมชน Lisp ล้มเหลวในการทำเช่นนี้ ดังนั้นกฎข้อที่สิบของฉัน: โปรแกรมเสียงกระเพื่อมที่มีความซับซ้อนเพียงพอประกอบด้วย ad-hoc, การใช้งานที่ระบุอย่างไม่เป็นทางการและการใช้งานข้อผิดพลาดของครึ่งหนึ่งของคอมไพเลอร์การจับคู่รูปแบบของ OCaml

ตัวอย่างเช่น: มันยังคงเป็นจริงหรือไม่ที่จะพิมพ์วัตถุทั่วไป?

เมื่อเขาเขียนว่าคุณไม่สามารถทำได้เพียง:

print value

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


การจับคู่รูปแบบ: ซอร์สโค้ดของ OCamlและoptimaอ้างอิงทั้งเอกสารเดียวกัน: "การปรับรูปแบบการจับคู่ให้เหมาะสมที่สุด" ฉันจะบอกว่าไม่สามารถใช้ "ad-hoc", "ข้อผิดพลาดขี่ม้า" และ "ระบุอย่างไม่เป็นทางการ" ได้ที่นี่ "F # มีทางออกที่ดีสำหรับปัญหานี้": ฉันอยากเห็นรายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับเรื่องนี้ถ้าเป็นไปได้ คำตอบนั้นดี แต่การสาปแช่งเมื่อพูดถึงconsให้เสียงที่ไม่ดี (บทความต้นฉบับเป็นคำพูดรุนแรง แต่คุณไม่จำเป็นต้องคัดลอกจากนั้น)
coredump

2
@coredump: "ฉันอยากเห็นรายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับเรื่องนี้ถ้าเป็นไปได้" F # มีการกำหนดความแตกต่างแบบ Ad-hoc สำหรับผู้ใช้งานและฟังก์ชั่นบางอย่าง ดังนั้นคุณสามารถใช้+กับ ints ลอยและคอมเพล็กซ์ แต่คุณยังสามารถกำหนดประเภทของคุณเองและเพิ่มเกินพิกัดสำหรับ+การทำงานกับประเภทของคุณ สิ่งนี้ให้ความกระชับและอ่านง่ายของ Lisp หรือ Haskell ด้วยประสิทธิภาพที่คาดการณ์ได้ดีของ SML หรือ OCaml บรรลุสิ่งที่ไม่มีภาษาอื่นทำ
Jon Harrop

@coredump: "ซอร์สโค้ด OCaml และ optima อ้างอิงทั้งเอกสารเดียวกัน" เทคนิคที่อธิบายไว้ในกระดาษนั้นถูกสร้างขึ้นทั้งหมดบนระบบชนิด ML ระบบชนิดที่ Lisp ไม่มี Optima ไม่ได้และไม่สามารถทำสิ่งที่อธิบายไว้ในบทความนั้นได้มากนัก เพียงดูหัวข้อ 4.2 "การใช้ข้อมูลความครบถ้วนสมบูรณ์" ไม่มีข้อมูลครบถ้วนสมบูรณ์ใน Lisp เนื่องจากไม่มีประเภทตัวแปร ตัวอย่างเช่น OCaml เลือกระหว่างการข้ามที่ซ้อนกันหรือตารางการจัดส่งตามจำนวนของใบไม้ แต่ข้อมูลนั้นไม่เป็นที่รู้จักใน Lisp
Jon Harrop

Lisp และ OCaml ได้รับการออกแบบมาสำหรับสิ่งต่าง ๆ (เช่นไดนามิก, การเขียนโปรแกรมด้วยภาพ) แต่ชัดมีระบบการพิมพ์ที่แตกต่างจาก Hindley-มิลเนอร์และการใช้งานไม่ใช้ประโยชน์จากมันในระหว่างการรวบรวม ดูเซสชัน SBCL นี้พร้อมตัวอย่างจากส่วน 4.2 ของบทความ มีการตรวจสอบความครบถ้วนสมบูรณ์แล้วโดยคอมไพเลอร์จากการอนุมานประเภทและการประกาศ Optima สามารถเพิ่มโค้ดเฉพาะการนำไปใช้งานสำหรับการขยายตัวแบบมหภาคเวลาคอมไพล์ (หรือ SBCL VOPs) เพื่อให้มีกลยุทธ์อื่น ๆ แต่มีแรงจูงใจไม่เพียงพอที่จะทำ
coredump

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