这是我作业的一小部分,我必须计算列表的元素,如果计数== 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。
答案 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