2012-01-01 71 views
1

試圖定義,將刪除組的最大的子集的功能,這也是一套的一個子集,從設置一個一個的時候,我遇到了以下錯誤:哈斯克爾 - 解析錯誤/使用多個where子句

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] 

如何執行多個條件/定義(使用其中或其他),或更正功能以正確工作的方式不同?

+2

'where b/= []'是什麼意思? – 2012-01-01 12:39:52

+0

預期的結果是那些不是'm'元素的'a'元素的列表? – 2012-01-01 12:52:11

+0

預期的結果確實是所有元素都不是m的元素。順便說一句,感謝丹尼爾的語法幫助,儘管它沒有解決問題。 – 2012-01-01 14:26:49

回答

4

說「集m的最大的子集,它也設定a的一個子集」 是一樣的說:「那也都是a元素m所有元素」。

然後解決您的問題表述簡單地:

exclude a = filter (`notElem` a) 

,當應用於m會給你的m一個子集模是同樣的a成員的任何元素 。也就是說,它將「刪除 m的最大子集,該子集也是a的子集」。

+0

+1切割所有內容,並以優雅,可讀和可理解的單行程結束。 – 2012-01-02 00:07:55

+2

-1不問這個問題。對不起,我來這裏是爲了在哪裏。 – ziggystar 2014-07-13 19:19:01

+0

@ziggystar,問題要求解決方案「在**或其他地方使用**」,甚至是「糾正函數以正確工作的方式」。在我看來,joachifm回答了問題,所以我不明白爲什麼他們應該受到懲罰。 – Vectornaut 2015-06-24 19:56:03

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 -clauses。但在where條款中,您只能有定義。條件將進入衛兵(或右側if then else表達式),可與布爾運算符,(&&)(||)not結合...

至於你的代碼,到目前爲止,我還沒有想出你打算怎麼做。

+0

非常感謝,非常清楚。 – vikingsteve 2014-01-06 08:58:24

0

實際上,Data.List和Data.Set中有一個函數叫'\'。我將顯示Data.List的'\'功能。

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