在haskell中写入递归函数大小,返回集合中元素的数量。不要使用库函数长度。
size :: Set a -> Int
这就是我到目前为止所做的。它看起来是正确还是我误解了问题是什么?感谢
size :: Set a -> Int
size [] = 1
size (_:xs) = 1 + size xs
答案 0 :(得分:0)
我认为您忘记了一个重要部分:空列表[]
的大小为0
,因此:
size :: Set a -> Int
size [] = 0 -- zero
size (_:xs) = 1 + size xs
除了代码之外,能够解释您的代码非常重要。第一个条款可以解释为:
“空列表的大小为零(0)”。
另一方面,递归条款可以解释为:
非空列表的大小与一个加上一个集合的大小减一个元素(头部)相同。
请注意,在此,我们假设类型Set a
与[a]
相同。但这意味着我们可以拥有重复条目的集合。如果我们不希望这样,我们应该使用唯一性过滤器。我们可以使用nub :: Eq a => [a] -> [a]
,或者我们可以在size
函数中实现它:
size :: Set a -> Int
size = size' []
where size' _ [] = 0
size' l (x:xs) | elem x l = size' l xs
| otherwise = 1 + size' (x:l) xs
答案 1 :(得分:0)
使用高阶函数的一种可能解决方案:
size :: Set a -> Int
size = sum . fmap (const 1)
这是有效的,因为Set
是Foldable
的一个实例,可以成为Functor
的实例。