ฉันเพิ่งเสร็จสิ้นlearnyouahaskellวันอื่น ๆ และผมก็พยายามที่จะทำให้ความรู้สึกของข้อ จำกัด Monomorphism, ตามที่อธิบายไว้โดย Haskell วิกิพีเดีย ฉันคิดว่าฉันเข้าใจว่า MR สามารถป้องกันการประเมินซ้ำ ๆ ได้อย่างไร แต่ฉันล้มเหลวที่จะดูว่าทำไมการประเมินซ้ำ ๆ เหล่านั้นไม่สามารถหลีกเลี่ยงได้โดยวิธีที่ตรงไปตรงมามากขึ้น
ตัวอย่างที่ฉันมีอยู่ในใจคือตัวอย่างที่ใช้โดยวิกิ:
f xs = (len,len)
where
len = genericLength xs
ที่เป็นประเภทgenericLength
Num a => [b] -> a
เห็นได้ชัดว่าgenericLength xs
ต้องมีการคำนวณเพียงครั้งเดียวเพื่อประเมิน(len,len)
เนื่องจากเป็นฟังก์ชันเดียวกันกับอาร์กิวเมนต์ที่เหมือนกัน และเราไม่จำเป็นต้องเห็นการเรียกร้องใด ๆf
ให้รู้ ดังนั้นทำไม Haskell ไม่สามารถทำการเพิ่มประสิทธิภาพนี้โดยไม่แนะนำกฎเช่น MR?
การอภิปรายในหน้าวิกินั้นบอกฉันว่ามีบางอย่างเกี่ยวกับความจริงที่ว่าNum
เป็น typeclass มากกว่าประเภทที่เป็นรูปธรรม แต่ถึงกระนั้นก็ไม่ควรที่จะรวบรวมไว้ในเวลาที่ฟังก์ชั่น pure จะคืนค่าเดิม - - และดังนั้นประเภทคอนกรีตเดียวกันของ Num - เมื่อได้รับอาร์กิวเมนต์เดียวกันสองครั้ง
f [] :: (Int, Float)
ผมไม่ได้รับการพิจารณาความเป็นไปได้ของ ตอนนี้มันสมเหตุสมผลดี ขอขอบคุณ.