使用map函数时如何访问下一个元素?

我正在尝试在 haskell 中的列表的每个元素上应用一个函数。因此我正在使用该map功能。我的代码应该将下一个元素的值添加到当前元素。

所以我认为我的代码应该看起来像这样:

test :: [Rational]
test = map (x -> x % {-somehow get next element -}) listT

listT 是一个 Int 类型的无限列表。

但是我如何“访问”下一个值?谢谢你的帮助

回答

要访问下一个元素,请tails改为映射:

mapWithNext op xs = map g (tails xs)
  where
  g (x:y:_) = Just (op x y)
  g _       = Nothing

因为当没有下一个元素时,你op不能被应用,尽管它只会发生在有限列表中。您可能知道输入列表将是无限的,但您的类型不会,因此最好是安全的。

您可能想要添加一个后处理步骤来摆脱最终Nothing(s) 并提取Just值。catMaybes :: [Maybe a] -> [a]似乎适用。

当然zipWith,在评论中使用(*) 更简洁,更重要,在这里;但这种方式tails通常更通用,即更容易修改以与三元 opzipWith一起使用。我们必须使用嵌套zipWith应用程序链并构建人工元组才能访问元素;与tails我们不需要做这样,在所有东西。

map(通常, foldr) 与的组合tails实际上是在模拟 paramorphism。它有它的优点,例如在 Common Lisp 中,它实际上是作为一个库函数出现的maplist

(*) 你可以说,zipWith不是地图,但例如在 Scheme 中就是这样。在那里,map接受任意数量的参数列表,以及相应数量的组合操作。但是当然 Haskell 不是 Scheme。


以上是使用map函数时如何访问下一个元素?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>