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.It's the same function name, with the same arguments, but potentially different return types and implementations, because it's polymorphic.
Saya pikir cara yang lebih baik untuk melihatnya adalah bahwa instance typeclass efektif argumen tambahangenericLength
dan kompiler tidak yakin itu argumen yang sama di kedua panggilan.a = uncurry (==) $ f [1, 2, 3]
Apakah itu dapat mengoptimalkan situs panggilan itu untuk hanya memeriksa panjang[1, 2, 3]
sekali? Jika demikian maka saya benar-benar bingung mengenai apa sebenarnya pembatasan monomorfisme yang membeli Anda, jika tidak maka mengapa tidak?