Entry tags:
Тонкости точной семантики сопоставления с образцом
Хорошая хотя и простая задачка возникла в процессе проверки домашних заданий. Чем отличается поведение следующих двух функций, и в чем причина такого отличия:
diff xs = do p <- zip xs (tail xs) return $ abs (fst p - snd p) diff' xs = do p <- zip (tail xs) xs return $ abs (fst p - snd p)
no subject
no subject
Разница в том, что diff' [] вычисляет сначала tail [] и отваливается с ошибкой.
Т.е. у zip только второй аргумент лениво вычисляется.
no subject
Дело в том, что сопоставление с образцом всегда делается сверху вниз (по уравнениям) и слева направо (по образцам-параметрам текущего уравнения). Поэтому, если первый в текущем уравнении образец представлен конструктором, то для сопоставления соответствующий параметр передаваемый в функцию должен быть приведен в WHNF. А у zip оказывается так, что если WHNF - это пустой список, то выбирается второе уравнение, которому пофиг на второй аргумент.
no subject
Т.е. (если я правильно пользуюсь терминами) zip всегда строгий по первому агрументу, и иногда не строгий по второму. А сопоставление с образцом -- это причина строгости/нестрогости.
no subject
Раньше take была строгая по первому аргументу, а стала "иногда нестрогая":
Но понятно, что это же совершенно маргинальное улучшение!
no subject
А нетотальные языки это вообще языки?
no subject
no subject
Соответственно,
zip [] (tail [])
выдаёт пустой список, аzip (tail []) []
исключение.no subject
хотя казалось бы...
no subject
no subject
(List.idr) ;)
no subject
Здравствуйте, извините что без стука
Re: Здравствуйте, извините что без стука
Re: Здравствуйте, извините что без стука