在Haskell中递归地从列表中删除元素

在Haskell中递归地从列表中删除元素,haskell,recursion,Haskell,Recursion,现在我正在处理Haskell中的一个问题,在这个问题中,我试图检查一个列表中的一对特定值,并根据它们是否存在于所述列表中返回True/False。问题如下: 定义一个函数,该函数以整数列表和两个整数作为参数。如果num1出现在列表中且num2出现在num1之后,则数字num1之后num2应返回true。如果不是,则必须返回false 我的计划是检查列表的开头是否有num1,并将其删除,然后递归地遍历,直到我“命中”它。然后,我将以尾部的头部检查num2,直到我击中或到达列表的末尾 我很早就被卡住

现在我正在处理Haskell中的一个问题,在这个问题中,我试图检查一个列表中的一对特定值,并根据它们是否存在于所述列表中返回True/False。问题如下:

定义一个函数,该函数以整数列表和两个整数作为参数。如果num1出现在列表中且num2出现在num1之后,则数字num1之后num2应返回true。如果不是,则必须返回false

我的计划是检查列表的开头是否有num1,并将其删除,然后递归地遍历,直到我“命中”它。然后,我将以尾部的头部检查num2,直到我击中或到达列表的末尾

我很早就被卡住了,因为到目前为止我已经做到了:

after :: [Int] -> Int -> Int -> Bool
after x y z
    | y /= head x =  after (drop 1 x) y z
但是,当我尝试运行诸如[1,4,2,6,5]4 5之后之类的内容时,会出现格式错误。我真的不知道如何恰当地表达这句话,这样haskell就会明白我要它做什么

非常感谢您的帮助!谢谢:

编辑1:这是有问题的错误:

Program error: pattern match failure: after [3,Num_fromInt instNum_v30 4] 3 (Num_fromInt instNum_v30 2)

试着这样做:

after :: [Int] -> Int -> Int -> Bool
after (n:ns) a b | n == a = ns `elem` b
                 | otherwise = after ns a b
after _      _ _ = False
基本上,函数逐项遍历列表。如果在任何时候它遇到第一个数字中的a,那么它会检查b是否在列表的其余部分。如果是,则返回True,否则返回False。此外,如果它到达列表的末尾而没有看到,则返回False

那么我们如何定义它呢?填空

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

[] `isSubsequenceOf` _ = ?
(_ : _) `isSubsequenceOf` [] = ?
xss@(x : xs) `isSubsequenceOf` (y:ys)
  | x == y = ?
  | otherwise = ?
示例:

  Prelude> after   [1,2,3,4,3] 88  7
  *** Exception: Prelude.tail: empty list
由于tail,它引发了一个异常。写tail很容易,这样就不会引发异常。否则,它工作得相当好

  Prelude> after  [1,2,3,4,3] 2  7
  False
  Prelude> after   [1,2,3,4,3] 2  4
  True

我的错误对不起,我的测试应该在后面,除非我误解了,否则赋值没有指定一个函数来确定a是否紧跟在b之后,只是如果它在它之后的某个点出现在列表中。如果是这样的话,那么这个解决方案回答了错误的问题。@Kwarrtz,您似乎把子序列和段混淆了。@dfuer,是的,我想我已经混淆了。我道歉。
   after :: [Int] -> Int -> Int -> Bool
   Prelude> let after xs a b =  elem b . tail $ dropWhile (/=a) xs
  Prelude> after   [1,2,3,4,3] 88  7
  *** Exception: Prelude.tail: empty list
  Prelude> after  [1,2,3,4,3] 2  7
  False
  Prelude> after   [1,2,3,4,3] 2  4
  True