грешка при анализа в модела

count a []       = 0
count a (b:xs) = c + count a xs
  where c = case b of
          (b==a) -> 1
          (b/=a) -> 0

GHCI дава грешката „Грешка при анализиране в образец: b == a“

Бих искал да знам защо възниква тази грешка при синтактичния анализ.

Благодаря ти.


person user3454449    schedule 24.03.2014    source източник


Отговори (2)


a == b не е модел, това е израз. Както казва другият отговор, нещо подобно ще работи:

case a == b of
  True  -> 1
  False -> 0

но това може да се напише по-просто като

if a == b then 1 else 0

Може би мислите за предпазители за шаблони?

case a of
  junk | a == b -> 1
       | a /= b -> 0

Като цяло, Haskell предлага толкова много различни начини за извършване на условно разклоняване, че може да бъде объркващо да разберете кой ви трябва. Образците обикновено са за случаите, когато искате да решите въз основа на това кой конструктор присъства, или искате да извлечете едно от полетата на конструктора в променлива за нещо. За сравняване на стойности обикновено искате вместо това if-израз.

person MathematicalOrchid    schedule 24.03.2014
comment
Защо изобщо ви трябва калъф там? - person Emil; 24.03.2014
comment
Алтернатива би била просто да използвам fromEnum за преобразуване на Bool в Int: where c = fromEnum $ a == b, в който момент вероятно просто ще го вмъкна в count a (b:xs) = fromEnum (a == b) + count a xs - person bheklilr; 24.03.2014
comment
О, Боже... това изглежда толкова ужасно. - person Emil; 24.03.2014
comment
Или просто, нали знаете, count a = length . filter (a ==)... Оперативната програма задаваше въпрос относно синтаксиса на модела, а не как това да се приложи по-добре. ;-) - person MathematicalOrchid; 25.03.2014

Това се случва, защото това, което имате там, не съответства на шаблони, което прави case of. Ако не греша, вие имате право да имате само конструктори на типове данни там, а не действителни функции.

Ако сте опитали нещо подобно

count a (b:xs) = c + count a xs
  where c = case b == a of
      True -> 1
      False -> 0

ще работи, но тогава е по-добре да използвате if b == a then 1 else 0 вместо това.

person Emil    schedule 24.03.2014