配对Haskell中的相邻列表项

Ale*_*lex 11 zip haskell list

我有一个链式列表

["root", "foo", "bar", "blah"]
Run Code Online (Sandbox Code Playgroud)

我想使用相邻的对将其转换为元组列表.像这样

[("root", "foo"), ("foo", "bar"), ("bar", "blah")]
Run Code Online (Sandbox Code Playgroud)

目前,我正在使用它来做到这一点:

 zipAdj x = tail (zip ("":x) (x++[""]))
Run Code Online (Sandbox Code Playgroud)

但是,我真的不喜欢这种方法.谁能想到更好的方法?如果我很明显地道歉,我对Haskell来说还是比较新的.

C. *_*ann 21

好的,这是评论作为答案:

zipAdj x = zip x $ tail x足够了.zip在到达两个列表中较短的列表的末尾时停止,因此这简单地将列表中的每个项目与其后继者配对,这似乎是您想要的.

并且为了解释无意义的版本:zip <*> tailApplicative实例用于"某种类型的函数",它基本上相当于一个轻量级的内联Reader monad - 在这种情况下,列表是Reader的"环境".通常这只是混淆了事情,但在这种情况下它几乎使它更清楚,假设你知道在(<*>)这里读"将这两个应用于一个参数,然后应用第一个到第二个".


Jos*_*ers 8

一种可能的方案:

pairs [] = []
pairs (x:[]) = []
pairs (x:y:zs) = (x, y) : pairs (y : zs)
Run Code Online (Sandbox Code Playgroud)

绝对不会像你的那么小,并且可能会相当优化.