Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何找到一个列表作为另一个列表的子列表显示的索引?_List_Haskell_Recursion_Sublist - Fatal编程技术网

List 如何找到一个列表作为另一个列表的子列表显示的索引?

List 如何找到一个列表作为另一个列表的子列表显示的索引?,list,haskell,recursion,sublist,List,Haskell,Recursion,Sublist,我已经和Haskell一起工作了一个多星期了,所以我正在练习一些可能有用的函数。我想递归地比较两个列表。当第一个列表出现在第二个列表中时,我只想返回列表开始匹配的索引。索引将从0开始。以下是我想要执行的澄清示例: subList [1,2,3] [4,4,1,2,3,5,6] 结果应该是2 我已尝试对其进行编码: subList :: [a] -> [a] -> a subList [] = [] subList (x:xs) = x + 1 (subList xs) subLi

我已经和Haskell一起工作了一个多星期了,所以我正在练习一些可能有用的函数。我想递归地比较两个列表。当第一个列表出现在第二个列表中时,我只想返回列表开始匹配的索引。索引将从0开始。以下是我想要执行的澄清示例:

subList [1,2,3] [4,4,1,2,3,5,6] 
结果应该是2

我已尝试对其进行编码:

subList :: [a] -> [a] -> a
subList [] = []
subList (x:xs) = x + 1 (subList xs)
subList xs = [ y:zs | (y,ys) <- select xs, zs <- subList ys]
        where select []     = []
              select (x:xs) = x
子列表::[a]->[a]->a
子列表[]=[]
子列表(x:xs)=x+1(子列表xs)

子列表xs=[y:zs |(y,ys)让我们首先看一下函数签名。您希望在两个列表中比较其内容是否相等,并返回如下索引

subList :: Eq a => [a] -> [a] -> Int
现在我们对参数进行模式匹配。首先,当第二个列表为空时,我们将无法执行任何操作,因此我们将返回-1作为错误条件

subList _ [] = -1
然后我们来看递归步骤

subList as xxs@(x:xs)
  | all (uncurry (==)) $ zip as xxs = 0
  | otherwise                       = 1 + subList as xs
您应该熟悉我使用的guard语法,尽管您可能不熟悉
@
语法。本质上,这意味着
xxs
只是我们使用
(x:xs)
时的一个替代项


您可能不熟悉
all
uncurry
,也可能不熟悉
zip
,所以让我详细介绍一下。
zip
具有函数签名
zip::[a]->[b]->[(a,b)]
,因此它需要两个列表并将它们的元素配对(如果一个列表比另一个长,它只需去掉多余的部分).
uncurry
很奇怪,让我们看看
(uncurry(=)
,它的签名是
(uncurry(=)::Eq a=>(a,a)->Bool
,它基本上检查两个元素中的第一个和第二个元素是否相等。最后,
all
将遍历列表,查看每对元素的第一个和第二个是否相等,如果是这样,则返回true。

一周后
all
uncurry
zip
可能不像w那样明显呃(也许你应该用
zipWith
和lambda来代替?)-但答案不错!@CarstenKönig很好,我会编辑它来更好地解释then@randomusername感谢您的解释,我对
zip
有点熟悉,因为我一直在阅读“向您学习Haskell”书。不过谢谢你给我解释其他的。@randomusername有一件事我还是有点困惑,当使用“@”语法时,我收到了该符号的解析错误。这是为什么?@ExecutionStyle21可能是我把顺序弄混了,我永远记不起它应该是哪一个。试试
xxs@(x:xs)
。我收到错误,但没有一个会说“输入时出错”。您确定粘贴的代码与您的代码完全相同吗?您是否尝试过仅使用此代码制作文件,以确保错误在这一部分中?