Saya baru saja selesai mempelajari Anda , mengatakan pada suatu hari, dan saya berusaha memahami Pembatasan Monomorphism, seperti yang dijelaskan oleh Haskell Wiki . Saya pikir saya mengerti bagaimana MR dapat mencegah evaluasi berulang, tetapi saya gagal melihat mengapa evaluasi berulang itu tidak dapat dihindari dengan cara yang jauh lebih mudah.
Contoh spesifik yang ada dalam pikiran saya adalah yang digunakan oleh wiki:
f xs = (len,len)
where
len = genericLength xs
dimana genericLength
tipe Num a => [b] -> a
.
Jelas, genericLength xs
hanya perlu dihitung sekali untuk mengevaluasi (len,len)
, karena fungsinya sama dengan argumen yang sama. Dan kita tidak perlu melihat doa f
untuk mengetahui hal itu. Jadi mengapa Haskell tidak dapat melakukan optimasi ini tanpa memperkenalkan aturan seperti MR?
Diskusi pada halaman wiki mengatakan kepada saya itu ada hubungannya dengan fakta bahwa itu Num
adalah typeclass daripada jenis beton, tetapi meskipun demikian, seharusnya tidak jelas pada saat kompilasi bahwa fungsi murni akan mengembalikan nilai yang sama- -dan dengan demikian jenis konkrit yang sama dari Bil - ketika diberi argumen yang sama dua kali?
f [] :: (Int, Float)
. Sekarang masuk akal. Terima kasih.