Я думаю, что Haskell просто оценит то, что нужно: поэтому он ищет x
и находит его в where
-пункте. Тогда я думаю, что он вычисляет x
один раз и делает all
.
Если вы хотите проверить это, вы можете написать функцию myall
, которая выполняет рекурсию, как в all (==x)
, но, по сути, просто печатает элемент сравнения. Таким образом, вы увидите, получаете ли вы каждый раз новый аргумент или каждый раз он остается одним и тем же.
Edit:
Вот небольшая функция для проверки этого: myall
просто собирает первые аргументы и помещает их в список.
myall x [] = [x]
myall x xs = x:(myall x (tail xs))
test xs = myall (x) xs where x = head xs
Если вы позвоните test [1,2,3]
, вы увидите, что результат равен [1,1,1,1]
, то есть сначала x
оценивается как 1
, после этого myall
оценивается.