2013-08-03 4 views
0

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

function thing1(x){ 
    if(x > 2){ 
     if(x < 5){ 
      return 3; 
     } 
     else if(x < 10){ 
      return 10; 
     } 
     else if(x >= 10){ 
      return 6; 
     } 
    } 
    else{ 
     return 4; 
    } 

} 

Однако, я до сих пор не понял, эквивалентный синтаксис в Haskell, после нескольких попыток: я пытался создать аналогичную функцию в Haskell , и я получил ошибку синтаксиса: prog.hs:10:1: parse error on input main':

thing1 x = 
    if x > 2 then 
     if x < 5 then 
      3 
     else if x < 10 then 
      10 
     else if(x >= 10) 
      6 
    else 
     4 

main = do 
    putStr(show(thing1 6)) 

я не уверен, что это неправильно с синтаксисом здесь: есть даже возможность создавать вложенные условные операторы в Haskell, как и в других языках?

+0

ошибка не связана с, если/еще здесь, но к выемке 'main'. Он должен начинаться в том же столбце, что и 'thing1'. – chirlu

+0

Каков результат, если x> = 10? – chirlu

+0

@chirlu Тогда он вернет '4', если программа была отформатирована правильно. –

ответ

9

Как пара людей предложили, вы можете сделать это легко с рисунком охранниками:

thing1 x 
    | x <= 2 = 4 
    | x < 5 = 3 
    | x < 10 = 10 
    | x >= 10 = ??? 

main = putStr (show (thing1 6)) 

не то, что так много аккуратнее? Разве не так ли проще выяснить, что именно возвращается в каждом случае?

Обновление: Прежде, чем я забуду, общая идиома, чтобы сделать это:

thing1 x 
    | x <= 2 = 4 
    | x < 5 = 3 
    | x < 10 = 10 
    | otherwise = 6 

Это делает его более понятным стороннему наблюдателю, что все случаи на самом деле охвачены.

+0

prog.hs: 5: 15: ошибка синтаксического анализа на входе '??? ' –

+0

Да - вам нужно определить, какой ответ должен быть для этого случая. – MathematicalOrchid

+1

согласно новому примеру ??? = 6 –

1

У вас нет неполной (не ответной) ветви в разделе X> 2?

if x < 5 then 
    3 
else if x < 10 then 
    10 
// else, what answer here? 

else в Haskell является обязательным.

См: http://en.wikibooks.org/wiki/Haskell/Control_structures

+0

В этом случае я хотел бы выйти из текущего условного блока и перейти к следующему оператору 'else'. Возможно ли это сделать в Haskell? –

+5

Используйте ограждения. В любом случае, лучше. – chirlu

+1

Я думаю, вы должны писать в Haskell знатные выражения, а не заявления GOTO и BREAK! Если это не выражение, оно не будет летать. Вы здесь не настоятельные. –

3

Вы забыли then после if(x >= 10), и вам также нужна ветка else. Но так как if(x >= 10) уже есть else филиал if x < 10 вы можете просто удалить if(x >= 10) или превратить его в комментарий:

thing1 x = 
if x > 2 then 
    if x < 5 then 
     3 
    else if x < 10 then 
     10 
    else 
     6 
else 
    4 
Смежные вопросы