确定Haskell中是否有重复项的显式递归

Syz*_*orr 2 recursion haskell list-comprehension

这是教程分配的一小部分,我们被要求首先使用列表推导定义函数,然后使用显式递归.

  1. 使用列表推导,定义一个函数

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

获取列表元素和列表,如果列表中有多个列表元素副本,则返回True.例如:

重复10 [1,2,11,11] =假

重复10 [1,2,10,11] =假

重复10 [1,2,10,10] =真

为此,我有以下代码:

duplicated::Eq a => a -> [a] -> Bool
duplicated n xs = length[x | x <- xs, x == n] > 1
Run Code Online (Sandbox Code Playgroud)

但无论我如何攻击这个,我都无法通过显式递归找到一种方法.

Aad*_*hah 5

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

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

以下是它的工作原理:

  1. 如果列表为空,则表示我们n在列表中找不到一个元素.因此,我们回来了False.
  2. 否则,如果列表的当前元素是,n则意味着我们找到了一个元素n.因此,我们返回elem n xs,检查是否n是在xs为好.
  3. 否则,我们递归调用duplicated n xs.

希望有所帮助.