Haskell сравнивает два int с оператором if

Я хочу реализовать функцию с именем log2, которая вычисляет целочисленный журнал (по основанию 2) своего аргумента. Я не могу использовать функцию журнала. Мое решение: проверить, равен ли x 2 ^ y. Если 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

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

error: parse error on input `if'

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

Haskell использует отступы и интервалы для обозначения области выражений. Ваше утверждение if имеет такой отступ, который указывает на то, что оно находится за пределами пункта where.

Bob Dalgleish 08.04.2019 15:48

Нужно ли мне помещать оператор if и else под оператором where или как?

Dani Kemper 08.04.2019 15:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
465
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Спасибо за ваше объяснение, если я запущу это и использую 10 для x, это не сработает. Но если я использую 4 вместо x, это будет. Как это возможно и как мы можем это исправить?

Dani Kemper 08.04.2019 16:01

Ну, ваша исходная программа работает только для точных степеней 2, верно? Один из способов улучшить его — написать >= вместо ==, тогда, по крайней мере, он остановится на 10. Но вам понадобится что-то более сложное, чем добавлять 1 каждую итерацию, чтобы найти точные логарифмы.

moonGoose 08.04.2019 16:03

Другие вопросы по теме