Haskell - 解析错误/使用多个where子句

时间:2012-01-01 12:32:54

标签: list haskell set where-clause

尝试定义一个函数,该函数将删除集合 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]

如何实现多个条件/定义(使用 where 或其他方式),或者更正函数以正确的方式以不同的方式工作?

3 个答案:

答案 0 :(得分:5)

您问题的一部分很容易回答。您可以在一个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 ... < / p>

至于你的代码,到目前为止我还没弄清楚你打算做什么。

答案 1 :(得分:4)

说“集合m的最大子集,它也是集合a的子集” 与“m的所有元素也是a的元素”相同。

然后,您的问题的解决方案简单地说明如下:

exclude a = filter (`notElem` a)

,当应用于m时,将为您提供m模块的任何元素 他们也是a的成员。也就是说,它将“删除最大的子集 m也是a“的一个子集。

答案 2 :(得分:0)

实际上,Data.List和Data.Set中有一个名为'\'的函数。我将显示Data.List的'\'函数。

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