Haskell - ошибка разбора / использование нескольких выражений where - PullRequest
1 голос
/ 01 января 2012

при попытке определить функцию, которая бы удаляла наибольшее подмножество из набора m , которое также является подмножеством из набора a из набора a , я столкнулсяследующая ошибка:

filename.hs:7:33:parse error (possibly incorrect indentation)

для следующего кода:

exclude :: Integral t => [t] -> [t] -> [t]
a `exclude` m
           | m == [] = a
           | a == (b ++ c) = b
           | otherwise = []
           where b /= []
           where c = [z | z <- m]

как мне реализовать несколько условий / определений (используя где или иначе), или исправитьфункция для правильной работы по-другому?

Ответы [ 3 ]

5 голосов
/ 01 января 2012

Одна часть вашего вопроса легко отвечает. В одном предложении where может быть несколько определений, как в

foo n
    | even r = bar
    | s < 12 = baz
    | otherwise = quux
      where
        r = n `mod` 1357
        h = a + b
          where
            (a,b) = r `divMod` 53    -- nested where-clause
        s = r - 3*h

и вы можете иметь вложенные where -классы. Но в where -пункте вы можете иметь только определения. Условия будут идти в охранники (или if then else выражения с правой стороны) и могут быть объединены с логическими операторами, (&&), (||), not ...

Что касается вашего кода, до сих пор я не понял, что вы намеревались сделать.

4 голосов
/ 01 января 2012

Говоря «наибольшее подмножество множества m, которое также является подмножеством множества a» все равно что сказать "все элементы m, которые также являются элементами a".

Тогда решение вашей проблемы формулируется просто как:

exclude a = filter (`notElem` a)

, который при применении к m даст вам подмножество m по модулю любых элементов которые также являются членами a. То есть он "удалит наибольшее подмножество m это также подмножество a ".

0 голосов
/ 02 января 2012

На самом деле in в Data.List и Data.Set есть функция с именем '\'. Я покажу функцию «\» Data.List.

import Data.List
exclude :: Integral t => [t] -> [t] -> [t]
a `exclude` m = a\\m
...