На полпути сюда...
https://en.wikibooks.org/wiki/Haskell/Laziness
...это упражнение, в котором спрашивают о влиянии изменений на альтернативную реализацию функции head
, которая использует неопровержимые шаблоны. Он дает определение head'
следующим образом, отмечая, что он всегда будет возвращать undefined
из-за неопровержимого совпадения первого уравнения:
head' :: [a] -> a
head' ~[] = undefined
head' ~(x:xs) = x
Потом спрашивает:
- Почему здесь не поможет изменение порядка уравнений на
head'
? - Если изменить первое уравнение, чтобы использовать обычный опровержимый образец, будет ли поведение
head'
отличаться от поведенияhead
? Если да, то как?
В GHC 7.8.4 кажется, что изменение порядка «помогает», по крайней мере, в том смысле, что эта функция ведет себя как обычная частичная версия head
, хотя и с другим исключением в случае пустого списка. Ответ на второй вопрос мне показался бы «нет», но, учитывая дополнение «если да, то как», мне кажется, что я тоже что-то упустил. Кто-нибудь может просветить меня? Ссылка на решения на странице, к сожалению, не распространяется на это упражнение.