我试图在一个整数列表中查找n,如果n存在,而不使用elem函数,则out应为true。
n
elem
present:: Integer -> [Integer] -> Bool present n llist = [x | x <- llist, x == n]
nukf8bse1#
您当前的present函数没有类型检查:[x | x <- llist, x == n]的结果是[Integer],而不是Bool。正如这个注解中所述,您可以通过使用null检查生成的列表是否为空来确定n是否在列表中:
present
[x | x <- llist, x == n]
[Integer]
Bool
null
present :: Integer -> [Integer] -> Bool present n llist = not $ null [x | x <- llist, x == n]
列表解析的结果是所有元素都等于原始列表中的n,因此,如果生成的列表为空,则原始列表中没有值为n的元素。另一个有趣的方法不使用elem,而是依赖于显式递归:
present :: Integer -> [Integer] -> Bool present _ [] = False -- base case present n (x:xs) | x == n = True | otherwise = present n xs
这里,输入列表的第一个元素与n进行比较,如果它等于n,则n存在于列表中,从而产生最终结果True,否则递归调用present。并且传递到present的输入列表随着每次递归变小一个元素直到它找到n或最终收敛到基本情况,空列表,在这种情况下产生False。
True
False
1条答案
按热度按时间nukf8bse1#
您当前的
present
函数没有类型检查:[x | x <- llist, x == n]
的结果是[Integer]
,而不是Bool
。正如这个注解中所述,您可以通过使用
null
检查生成的列表是否为空来确定n
是否在列表中:列表解析的结果是所有元素都等于原始列表中的
n
,因此,如果生成的列表为空,则原始列表中没有值为n
的元素。另一个有趣的方法不使用
elem
,而是依赖于显式递归:这里,输入列表的第一个元素与
n
进行比较,如果它等于n
,则n
存在于列表中,从而产生最终结果True
,否则递归调用present
。并且传递到present
的输入列表随着每次递归变小一个元素直到它找到n
或最终收敛到基本情况,空列表,在这种情况下产生False
。