计算列表中的元素(haskell)

时间:2012-01-03 13:38:56

标签: haskell

这是我作业的一小部分,我必须计算列表的元素,如果计数== 2则返回true。该列表的元素不是固定的,而是使用不同的函数进行过滤,例如allNumbers。我必须使用这个现有的函数来检查它是否有2个元素。

检查功能的定义是:

isTrue :: Int -> Bool

我有一个当前的函数定义

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

这样做会列出除以n的所有数字。现在我需要在同一个程序中创建另一个函数isTrue,如果上面函数生成的列表只有两个数字,它将给出true。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

我不想放弃整个解决方案,但我认为值得指出的是,除了使用length函数计算列表长度然后产生适当结果的某些解决方案之外,你也可以考虑在这里使用pattern matching,因为你与(2)比较的长度非常小。像

这样的东西
hasLengthOfTwo <pattern_matching_lists_with_two_elements> = True
hasLengthOfTwo _ = False

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

答案 2 :(得分:0)

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