Я только что закончил учить вас на днях, и я пытался разобраться в ограничении мономорфизма, как описано в Haskell Wiki . Я думаю, что понимаю, как MR может предотвратить повторные оценки, но я не понимаю, почему этих повторных оценок нельзя избежать гораздо более простыми способами.
Я имею в виду конкретный пример, используемый вики:
f xs = (len,len)
where
len = genericLength xs
где genericLengthтипа Num a => [b] -> a.
Очевидно, что genericLength xsдля вычисления необходимо вычислить только один раз (len,len), поскольку это одна и та же функция с одинаковыми аргументами. И нам не нужно видеть никаких призывов, fчтобы знать это. Так почему же Haskell не может выполнить эту оптимизацию без введения правила, подобного MR?
Обсуждение на этой вики-странице говорит мне, что это как-то связано с тем, что Numэто класс типов, а не конкретный тип, но даже в этом случае, если во время компиляции не должно быть очевидным, что чистая функция будет возвращать то же значение, и, следовательно, тот же конкретный тип Num - когда приводятся одни и те же аргументы дважды?
f [] :: (Int, Float). Теперь это имеет смысл. Спасибо.