尝试定义一个函数,该函数将删除集合 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 或其他方式),或者更正函数以正确的方式以不同的方式工作?
答案 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