Трудно точно объяснить, почему возникает синтаксическая ошибка, учитывая, что неясно, какому (допустимому) синтаксису он предназначен соответствовать.Достаточно сказать, что вы написали по существу log2 x = 0
if .....
.Можно было бы ожидать, что вторая фраза будет определением или частью того же выражения, что и 0
, но if
не начинается ни.
В более общем случае, Haskell не имеет изменяемых переменных.Вы не можете «присвоить» y
.Ближе всего к тому, что вы хотите, будет что-то вроде
log2 x = until (\y -> x == 2^y) (\y -> y + 1) 0
Обратите внимание, что мы никогда не присваиваем y
, мы просто привязываем его для выполнения каждого лямбда-выражения.Мы можем представить, что каждый раз получаю новое имя!и это было бы хорошо.