用于确定 Haskell 中是否重复的显式递归

Explicit Recursion for Determining If Duplicates in Haskell

这是教程作业的一小部分,我们被要求首先使用列表理解定义一个函数,然后使用显式递归。

  1. Using a list comprehension, define a function

duplicated :: Eq a => a -­‐> [a] -­‐> Bool

that takes a list element and a list and returns True if there is more than one copy of the list element in the list. For example:

duplicated 10 [1,2,11,11] = False

duplicated 10 [1,2,10,11] = False

duplicated 10 [1,2,10,10] = True

为此我有以下代码:

duplicated::Eq a => a -> [a] -> Bool
duplicated n xs = length[x | x <- xs, x == n] > 1

但是无论我怎么攻击它,我都无法找到一种方法来使用显式递归来完成此操作。

这是使用显式递归的方法:

duplicated :: Eq a => a -> [a] -> Bool
duplicated _ []     = False
duplicated n (x:xs) = callback n xs
    where callback  = if x == n then elem else duplicated

工作原理如下:

  1. 如果列表为空则意味着我们在列表中甚至没有找到一个元素 n。因此,我们 return False.
  2. 否则,如果列表的当前元素是n那么就意味着我们找到了一个元素n。因此我们 return elem n xs 检查 n 是否也在 xs 中。
  3. 否则,我们递归调用duplicated n xs.

希望对您有所帮助。