2011-04-12 24 views
1

可能重複:
Searching through list如何對付列表中的重複的元素在Haskell

我需要編寫一個函數「一次」其中,由於整數和列表整數n返回一個布爾值,指示n是否僅在列表中出現一次。例如。

Main> once [2,3,2,4] 2 
False 
Main> once [1..100] 2 
True 

這裏是我當前的代碼:

once :: Int -> [Int] -> Bool 
once x [] = False 
once x (y:ys) = (x==y) || (once x ys) 

它檢查X只是否是列表的一部分,但它不能告訴X在列表中出現不止一次,因此返回false。 需要幫助,謝謝!

+0

我打賭遵循相同的課程兩名學生:d – 2011-04-13 09:28:49

+1

我希望教授範德姆特並不決定另設的評估,因爲你的愚蠢和懶惰,而不是隻能做自己,但到甚至改變問題的評估... – 2011-04-14 16:48:31

回答

1

這樣做有很多可能性。如果你知道該列表是有限的,你可以說:

once x xs = length (filter (==x) xs) == 1 

(如果不是有限的,有沒有辦法解決。)

順便問一下,您把它幾乎在您的解決方案,你只要更換

|| (once x ys) 

&& (x `notElem` ys) 
+0

如果它是一個無限集,怎麼辦?謝謝... – sefirosu 2011-04-12 16:13:34

+3

它可能需要一段時間,如果它是無限的:) – 2011-04-12 16:18:14

+0

這是一個確切的重複,甚至下一個問題的http:// stackoverflow。 com/questions/5600706/searching-through-list ... – 2011-04-12 16:27:00

1

試試這個:

  • 編寫一個函數once,該函數掃描列表,直到找到第一次或列表結束的元素。在後一種情況下,它返回False,否則它會在列表的其餘部分調用once'並返回結果。
  • once'的確與once基本相同,但是如果找到元素則返回False,如果沒有則返回True