我有一个链式列表
["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 <*> tail将Applicative实例用于"某种类型的函数",它基本上相当于一个轻量级的内联Reader monad - 在这种情况下,列表是Reader的"环境".通常这只是混淆了事情,但在这种情况下它几乎使它更清楚,假设你知道在(<*>)这里读"将这两个应用于一个参数,然后应用第一个到第二个".
一种可能的方案:
pairs [] = []
pairs (x:[]) = []
pairs (x:y:zs) = (x, y) : pairs (y : zs)
Run Code Online (Sandbox Code Playgroud)
绝对不会像你的那么小,并且可能会相当优化.
| 归档时间: |
|
| 查看次数: |
1975 次 |
| 最近记录: |