Geçen gün learnyouahaskell'i yeni bitirdim ve Haskell Wiki tarafından tarif edildiği gibi Monomorfizm Kısıtlamasını anlamaya çalışıyordum . MR'nin tekrarlanan değerlendirmeleri nasıl önleyebileceğini anladığımı düşünüyorum, ancak tekrarlanan bu değerlendirmelerin neden daha basit yollarla önlenemediğini göremiyorum.
Aklımdaki belirli örnek wiki tarafından kullanılan örnek:
f xs = (len,len)
where
len = genericLength xs
genericLength
türü nerede Num a => [b] -> a
.
Açıkçası, değerlendirmek için genericLength xs
sadece bir kez hesaplanması gerekir (len,len)
, çünkü aynı argümanlarla aynı işlevdir. Bunu f
bilmek için herhangi bir çağrıyı görmemize gerek yok . Peki Haskell neden MR gibi bir kural getirmeden bu optimizasyonu yapamıyor?
Bu wiki sayfasındaki tartışma bana bunun Num
somut bir tipten ziyade bir daktilo sınıfı olduğu gerçeği ile ilgisi olduğunu söylüyor, ancak öyle olsa bile, derleme zamanında saf bir fonksiyonun aynı değeri döndüreceği açık olmamalı- -ve böylece aynı somut Num tipi - aynı argümanlar iki kez verildiğinde?
f [] :: (Int, Float)
. Şimdi çok mantıklı. Teşekkür ederim.