Haskell递归函数大小,返回集合中元素的数量

时间:2017-09-21 01:20:11

标签: function haskell recursion size

在haskell中写入递归函数大小,返回集合中元素的数量。不要使用库函数长度。

size ::  Set a -> Int

这就是我到目前为止所做的。它看起来是正确还是我误解了问题是什么?感谢

  size ::  Set a -> Int
  size [] = 1
  size (_:xs) = 1  + size xs

2 个答案:

答案 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)

这是有效的,因为SetFoldable的一个实例,可以成为Functor的实例。