2012-01-03 104 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 

一个小的(可能不相关的)优点是,它也适用于无限列表。