Haskell сравнивает два типа int с оператором if - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу реализовать функцию с именем log2, которая вычисляет целочисленный log (основание 2) своего аргумента.Я не могу использовать функцию журнала.Мое решение: проверить, равен ли х 2 ^ у.Если x равно 2 ^ y, дайте значение y, если x не равно 2 ^ y, тогда y = y + 1. Это будет продолжаться до тех пор, пока не будет найдено y.Это то, что я получил до сих пор:

log2 x = y where y = 0
    if x == 2^y then y
    else y = y + 1

Когда я хочу запустить это, я получу эту ошибку:

ошибка: ошибка синтаксического анализа при вводе `if '

Я новичок в Хаскеле, так что кто-нибудь может объяснить мне, что не так?

1 Ответ

3 голосов
/ 08 апреля 2019

Трудно точно объяснить, почему возникает синтаксическая ошибка, учитывая, что неясно, какому (допустимому) синтаксису он предназначен соответствовать.Достаточно сказать, что вы написали по существу log2 x = 0 if ......Можно было бы ожидать, что вторая фраза будет определением или частью того же выражения, что и 0, но if не начинается ни.

В более общем случае, Haskell не имеет изменяемых переменных.Вы не можете «присвоить» y.Ближе всего к тому, что вы хотите, будет что-то вроде

log2 x = until (\y -> x == 2^y) (\y -> y + 1) 0

Обратите внимание, что мы никогда не присваиваем y, мы просто привязываем его для выполнения каждого лямбда-выражения.Мы можем представить, что каждый раз получаю новое имя!и это было бы хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...