Проблема новичка с синтаксисом Haskell

Итак, я пока использовал Haskell только для простых руководств, и приведенный ниже код дает мне «ошибку синтаксического анализа»… Я знаю, что это как-то связано с моим синтаксисом, но я понятия не имею, что

 --ternarySearch
  7 ternarySearch :: (Float -> Float) -> Float -> Float -> Float -> Float
  8 ternarySearch f a b tau = do 
  9                         if (abs(b-a) < tau)
 10                           then return ((a+b)/2)
 11                         c = (a + (b-a)/3)
 12                         d = (b - (b-a)/3)
 13                         if f(c) < f(d)
 14                           then return (ternarySearch f c b tau)
 15                         else return (ternarySearch f a d tau)

Ошибка, которую я получаю:

ternary.hs:11:25: parse error on input `c'

Любые идеи?


person otg6e    schedule 20.03.2015    source источник
comment
Вы делаете много вещей неправильно: do-notation без использования Monad, Indendation, if/else неправильно. Я бы посоветовал вам изучить Haskell с помощью любого учебника/книги, прежде чем пробовать программы на нем.   -  person Sibi    schedule 20.03.2015
comment
да, к сожалению, это один из моих первых набегов на язык. Для начала: каким должен быть отступ? Это, безусловно, одна из основных проблем, доставляющих мне неприятности.   -  person otg6e    schedule 20.03.2015
comment
nvm Я думаю, что у меня есть отступ, но моя главная проблема остается прежней: что вызывает ошибку синтаксического анализа?   -  person otg6e    schedule 20.03.2015
comment
Отсутствие else. В большинстве других языков else является необязательным. В Haskell if больше похоже на ?:, чем на if в других языках: if x then y похоже на запись x ? y в C и выдаст вам ошибку по тем же причинам: это выражение, и оно не может не иметь значения, когда условие ложно.   -  person Amadan    schedule 20.03.2015


Ответы (1)


Вы многое делаете неправильно:

  • Вы не должны использовать do-нотацию, если контекст не является Monad.
  • Неправильное использование return: я думаю, вы путаете императивный язык return с языком Haskell.
  • Использование if/else: обратите внимание, что в Haskell if-else является выражением. Таким образом, и if, и else являются обязательными, в отличие от некоторых других языков.
  • Отступ кажется неправильным: см. правила здесь.

Лучшая версия того, что вы пытаетесь сделать с помощью охранников:

ternarySearch :: (Float -> Float) -> Float -> Float -> Float -> Float
ternarySearch f a b tau 
    | abs (b-a) < tau = (a+b) / 2
    | f c < f d = ternarySearch f c b tau
    | otherwise = ternarySearch f a d tau
    where
      c = a + (b-a)/3
      d = b - (b-a)/3

При этом я бы посоветовал вам прочитать какую-нибудь книгу, чтобы лучше понять.

person Sibi    schedule 20.03.2015
comment
хорошо, спасибо за помощь (и терпение). На самом деле я уже начал вносить изменения в конце, и вы определенно правы в том, что я думал об императивном возврате. - person otg6e; 20.03.2015