如果列表按顺序包含某些信息,请说明

Anc*_*end 0 haskell

给出如下列表:

let list = [1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

我试图想出一种方法来检测7,8,9列表中是否按顺序存在,只是打印输出"成功",如果确实如此,否则"失败".

我正在尝试使用zip索引来完成此操作.有人可以建议我是否在正确的轨道上或是否有更好的方法来实现这一目标?

zip [0..] list
Run Code Online (Sandbox Code Playgroud)

然后是这样的:

[if (snd x)== 
             7 && let index = (fst x) 
               && (snd x)==8 && (fst x)==(index+1) 
               && (snd x)==9 && (fst x)==(index+2) 
               then "success" 
               else "fail" | x <- list]
Run Code Online (Sandbox Code Playgroud)

sha*_*ang 8

在试图找出列表算法时,通常最好先考虑列表头中的特殊情况.在这种情况下,您将如何测试列表的开头[7,8,9]

beginsWith789 :: [Int] -> Bool
beginsWith789 (7:8:9:_) = True
beginsWith789 _         = False
Run Code Online (Sandbox Code Playgroud)

即我们可以将模式匹配到前三个元素.现在概括一下,如果我们在列表头中找不到子序列,我们递归检查列表的尾部

contains789 :: [Int] -> Bool
contains789 (7:8:9:_) = True
contains789 (_:xs)    = contains789 xs
contains789 _         = False
Run Code Online (Sandbox Code Playgroud)

现在,如果我们想进一步推广它以找到任何子序列,我们可以使用以下isPrefixOf函数Data.List:

import Data.List (isPrefixOf)

contains :: Eq a => [a] -> [a] -> Bool
contains sub lst | sub `isPrefixOf` lst = True
contains (_:xs)  = contains sub xs
contains _       = False
Run Code Online (Sandbox Code Playgroud)

我们可以通过使用anytails检查列表的任何连续较短的尾部是否以给定的子序列开始来整理它:

import Data.List (isPrefixOf, tails)

contains :: Eq a => [a] -> [a] -> Bool
contains sub = any (sub `isPrefixOf`) . tails
Run Code Online (Sandbox Code Playgroud)

或者,我们可以简单地使用标准库函数isInfixOf.;)

> import Data.List
> [7,8,9] `isInfixOf` [1,2,3,4,5,6,7,8,9]
True
Run Code Online (Sandbox Code Playgroud)


sab*_*uma 6

我会推荐这个isInfixOf功能Data.List.查找序列非常简单

let hasSequence = [7,8,9] `isInfixOf` list
Run Code Online (Sandbox Code Playgroud)

  • 与往常一样,[Hoogle](http://www.haskell.org/hoogle/)非常适合在您不确定它们是否存在时找到这些实用功能.在这种情况下,我们需要一个带有两个列表的函数,并返回一个是否是另一个列表.那种类型的签名是`[a] - > [a] - > Bool`,当我们在Hoogle中输入时,`isInfixOf`位于[results]的顶部(http://www.haskell.org)/hoogle/hoogle =%5Ba上%5D + - ?%3E +%5Ba上%5D + - %3E +布尔). (2认同)