2012-01-03 126 views
0

這是我家庭作業的一小部分,我必須計算列表中的元素,如果count == 2則返回true。該列表中的元素不是固定的,而是使用不同的函數進行過濾,例如allNumbers。我必須使用這個現有的函數來檢查它是否有2個元素。計算列表中的元素(haskell)

檢查功能的定義是:

isTrue :: Int -> Bool 

我有一個當前功能定義

divisors :: Int -> [Int] 
divisors n | n < 1 = [] 
      | otherwise = filter (\k -> n `mod` k == 0) [1..n] 

這樣做是列出了整除n的所有號碼。現在我需要在同一個程序中創建另一個函數isTrue,如果上述函數生成的列表只有兩個數字,則該函數將賦予true。

+0

'divisors'生成的列表只能包含數字,因爲它被稱爲'Int'的列表。你的意思是「[只有* 2 *號碼]」嗎? – phimuemue 2012-01-03 14:28:00

+0

感謝您的回覆。是列表是Int的列表,我的意思是,如果由除數生成的列表僅包含2個元素,則isTrue是一個不同的函數,返回true。所以我猜測它會處於n> 1的狀態,但現在確定如何在這裏實現它。 – Amjad 2012-01-03 14:47:14

回答

7

據我所知,你需要一個函數獲取一個列表並返回一個布爾值。因此,簽名應該是這樣的:

doit :: [a] -> Bool 

doit (x:y:z) = True -- matches if the list contains at least 2 elements 
doit _ = False  -- matches otherwise (i.e. list has 0 or 1 element) 

-- or, we match only if the length is exactly 2 

newdoit :: [a] -> Bool 
newdoit [a,b] = True 
newdoit _ = False 

-- or even more elegant 
simpledoit l = (length l)==2 

-- the complete function is then e.g. 
completefunc l = newdoit (divisors l) 
+0

我在我的問題中犯了一個錯誤。函數isTrue應該返回true,如果列表的數量等於2.除此之外的其他值都是false。 – Amjad 2012-01-03 13:49:12

+0

謝謝。但是如何使用其他函數的結果(列表)來代替[Int]或[a]? – Amjad 2012-01-03 14:03:46

+1

'simpledoit(otherfunction mylist)',順便說一句:你知道嗎? http://learnyouahaskell.com/chapters – phimuemue 2012-01-03 14:04:29

0
length' xs = case ((length xs) > 2) of 
        True -> True 
        _ -> False 
+0

呃,來吧,然後至少'長度'xs =(長度xs)> 2'請。 – ShiDoiSi 2015-03-17 08:11:36

4

我不想放棄的整體解決方案,但我認爲這是值得指出的是,除了去爲它使用length功能有一定的解決方案計算列表的長度,然後產生一個合適的結果,你也可以考慮在這裏使用pattern matching,因爲你和(2)比較的長度很小。所以像

hasLengthOfTwo <pattern_matching_lists_with_two_elements> = True 
hasLengthOfTwo _ = False 

一個小的(可能不相關的)優點是,它也適用於無限列表。