Как мне исправить мое условное утверждение на Haskell? - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь сделать простое условное утверждение, которое проверяет, равно ли значение другому значению, а затем устанавливает логическое значение на true или false, но у меня возникли некоторые трудности.

Пока чтоЯ пытался переформатировать свой текст несколькими различными способами, ни один из которых не сработал, но я не нахожу особой помощи в официальной документации или в поиске проблемы.

import Data.List

numberB :: Integer
numberB = 10
eql :: Integer -> Bool
eql = 10
if eql == numberB
  then True
  else False

Ошибкав настоящее время я получаю сообщение:

functions.hs:14:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
   |
14 | if eql == numberB
   | ^^^^^^^^^^^^^^^^^...

Я не совсем уверен, что мне здесь нужно, поскольку я не могу найти никаких эффективных объявлений об импорте. Я также не думаю, что есть какие-то модули, которые мне действительно нужно использовать, так как я здесь не делаю модуль, и, как я упоминал ранее, я не смог найти ни одного оператора импорта, который бы помог этой работе. Я также не уверен, что такое декларация верхнего уровня, так как я не настолько опытен в Хаскеле. Тем не менее, я не знаю, что это могло бы сделать, чтобы исправить эту ошибку.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2019

Ничего плохого в вашем условном выражении , но к какому определению оно относится?

Чтобы решить это, Haskell использует отступ . Любой код, являющийся частью некоторого определения, должен иметь отступ хотя бы под один пробел:

name =   -- value
  if eql == numberB
    then True
    else False

Но ваш if ... начинается с того же столбца, что и предыдущее определение, eql = ....

Таким образом, это кусок кода, который не относится ни к какому определению, и это синтаксическая ошибка, которую вы получаете (которая говорит о «объявлениях», которые, я думаю, является официальным термином для него).

В определении

eql = 10

имя eql и значение 10. Он не будет соответствовать объявленному типу

eql :: Integer -> Bool

, но синтаксическая ошибка прерывает компиляцию даже перед проверкой типов.

3 голосов
/ 04 ноября 2019

Давайте немного замедлим процесс, прежде всего, давайте рассмотрим тип эквалайзера:

(==) :: Eq a => a -> a -> Bool

вы хотите сравнить два Integer

numberB :: Integer
numberB = 10
eql :: Integer
eql = 10

и даОдин из способов сделать это:

comparision = if eql == numberB
              then True
              else False

Но по определению == вы можете удалить if, это избыточно, поэтому:

comparisionShort = eql == numberB

и помните также, что вВ Haskell вы должны связать значения с чем-то, вы не можете просто написать if просто так.

2 голосов
/ 04 ноября 2019

Вы объявили eql как Integer -> Bool, которая является функцией, которая принимает Integer и возвращает bool, а затем присваивает ему целочисленное значение 10. В отличие от языков с динамической типизацией, таких как python, вы не можете переназначать переменным значениедругой тип. Что вы, вероятно, хотите, это:

numberA ::Integer
numberB ::Integer
eql :: Bool
numberA = 10
numberB = 10
eql = numberA == numberB

...