2015-03-20 3 views
0

Итак, я использовал 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' 

Любые идеи?

+3

Вы делаете много вещей не так: do-notation без использования Monad, Indendation, если/else не так. Я бы посоветовал вам изучить Haskell, используя любой учебник/книгу, прежде чем тестировать в нем программы. – Sibi

+0

Да, к сожалению, это один из моих первых набегов на язык. Для начала: как должен выглядеть отступ? Это, безусловно, одна из главных проблем, которые вызывают у меня проблемы. – otg6e

+0

nvm Я думаю, что у меня есть indentaion, но моя основная проблема остается неизменной: что вызывает ошибку синтаксического анализа? – otg6e

ответ

6

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

  • Вы не должны использовать делать-обозначения, если контекст не является Monad.
  • Неправильное использование return: Я думаю, вы вводите в заблуждение императивные lanaguages ​​return с одним Haskell.
  • if/else use: Обратите внимание, что в Haskell if-else это выражение. Таким образом, оба варианта if и else являются обязательными, а не некоторыми другими языками.
  • Indendation кажется неправильным: см rules here.

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

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 

Это, как говорится, я хотел бы предложить вам прочитать некоторые book чтобы лучше понять.

+0

ОК, спасибо за помощь (и терпение). Я на самом деле уже начал менять «где» в конце, и вы определенно правы в том, что я думал о императивном «возврате», – otg6e