用于确定 Haskell 中是否重复的显式递归
Explicit Recursion for Determining If Duplicates in Haskell
这是教程作业的一小部分,我们被要求首先使用列表理解定义一个函数,然后使用显式递归。
- 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
工作原理如下:
- 如果列表为空则意味着我们在列表中甚至没有找到一个元素
n
。因此,我们 return False
.
- 否则,如果列表的当前元素是
n
那么就意味着我们找到了一个元素n
。因此我们 return elem n xs
检查 n
是否也在 xs
中。
- 否则,我们递归调用
duplicated n xs
.
希望对您有所帮助。
这是教程作业的一小部分,我们被要求首先使用列表理解定义一个函数,然后使用显式递归。
- 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
工作原理如下:
- 如果列表为空则意味着我们在列表中甚至没有找到一个元素
n
。因此,我们 returnFalse
. - 否则,如果列表的当前元素是
n
那么就意味着我们找到了一个元素n
。因此我们 returnelem n xs
检查n
是否也在xs
中。 - 否则,我们递归调用
duplicated n xs
.
希望对您有所帮助。