Есть ли какой-либо способ для краткого выражения в Haskell

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

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

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

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

Ответ 1

Удалите = после 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

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

Ответ 2

Этот код почти прав, вам нужен только правильный отступ: пробелы имеют значение в 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

Ответ 3

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

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 }

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