2013-04-01 2 views
10

я пытался написать 3-4, где оператор в одной функции, но я получаю ошибку и не смог это сделать, я пытался сделать что-то вроде этого:есть ли способ для нескольких, где оператор в Haskell

foo x= 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where foo1= samplefunct1 x 
     foo2= samplefunct2 x 
     foo3= samplefunct3 x 

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

Есть ли кто-нибудь, кто может мне помочь? Заранее спасибо.

+2

Не должно быть '=' после 'foo x'. – gspr

+0

@gspr, да, вы сожалеете об этом, но, думаю, это был не настоящий вопрос. –

+5

Кроме того, я предлагаю вам в будущем включить любую ошибку, которую вы получите. Просто говоря людям, что вы «получаете ошибку», не является конструктивным. – gspr

ответ

18

Снимите = после foo x и отступы вашего кода

foo x 
    | x == foo1 = 5 
    | x == foo2 =3 
    | x == foo3 =1 
    | otherwise =2 
    where foo1 = samplefunct1 x 
      foo2 = samplefunct2 x 
      foo3 = samplefunct3 x 

и все в порядке.

+0

, когда я писал, как я коснуться получаю ошибку о том, «ошибка синтаксиса при вводе (неожиданный' = ') »моя где заявление часть \t | в противном случае = (-1, -1) \t где rightk = rightCheck область номер leftk = leftCheck номер области и когда я удаляю одно из операторов where, он работает правильно. –

+0

Вы уверены, что ваши пробелы верны? Трудно сказать, что вы подразумеваете под кодом «как» мой. То, что я вставил, не имеет синтаксических ошибок. – gspr

+0

Ах, в этом случае, похоже, ваш код может очень сильно отличаться от того, что вы наклеили выше. Включение фактического кода может помочь. – gspr

8

Этот код почти прав, вам нужен только правильный отступ: пробелы имеют значение в haskell. Кроме того, использование = после foo является ошибкой с защитой, поэтому вам также придется удалить это. Результат:

foo x 
    | x == foo1 = 5 
    | x == foo2 =3 
    | x == foo3 =1 
    | otherwise =2 
    where foo1= whatever1 x 
     foo2= whatever2 x 
     foo3= whatever3 x 
+0

спасибо, но я хочу использовать 3 разных функции в каждой инструкции where.As вы можете видеть из моего кода первое, где выполняется с samplefunc1, а второе работает с samplefunct2 и т. Д., Уверены ли вы в этом? –

+1

да, я просто использовал 'id', поэтому он скомпилирован, неважно, что вы там вставляете – jozefg

+0

Я отредактировал, чтобы сделать его понятным – jozefg

7

Если отступы немного неровный, как это:

foo x 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where foo1= samplefunct1 x 
     foo2= samplefunct2 x 
     foo3= samplefunct3 x 

тогда действительно, переговоры сообщение об ошибке о неожиданной = (и в будущем, пожалуйста, включают в себя полный сообщение об ошибке в теле вопроса).

Вы исправить эту ошибку путем повторного выравнивания, или с { ; }:

foo x 
| x == foo1 = 5 
| x == foo2 =3 
| x == foo3 =1 
| otherwise =2 
where { foo1= samplefunct1 x ; 
     foo2= samplefunct2 x ; 
      foo3= samplefunct3 x } 

работает нормально (не то, что это хороший стиль для использования). Иногда это даже выглядит даже для вас, но нет, если есть символы табуляции скрывается в белом пространстве.

Смежные вопросы