将列表扩展为路径

时间:2018-03-15 11:44:17

标签: haskell

我有一个这样的清单:

 input = [[1,1], [3,3], [5,5], [7,7]]

我想要这个输出:

[[[1,1],[3,3]],[[3,3],[5,5]],[[5,5],[7,7]]]

(目标是让路径[1,1]-[3,3], [3,3]-[5,5], [5,5]-[7,7]成为路径......顺便说一下这个问题是重复的,我不会感到惊讶。)

我能够得到这样的输出:

> map (\i -> [input!!i, input!!(i+1)]) [0 .. length input-2]
[[[1,1],[3,3]],[[3,3],[5,5]],[[5,5],[7,7]]]

你有更清洁的解决方案吗?肯定会有更清洁的东西。

2 个答案:

答案 0 :(得分:4)

您可以SELECT FOOD_TYPE, BEST_BEFORE FROM TABLE where BEST_BEFORE between cast(getdate() as date) and dateadd(day, 30, cast(getdate() as date)) zip使用它的尾部来获取元组列表:

input

从那里,如果你需要它,你可以编写一个函数,从每个元组中列出一个列表,例如。

Prelude> zip input $ tail input
[([1,1],[3,3]),([3,3],[5,5]),([5,5],[7,7])]

这使您可以映射压缩列表:

tupleToList :: (t, t) -> [t]
tupleToList (x, y) = [x, y]

请注意Prelude> fmap tupleToList $ zip input $ tail input [[[1,1],[3,3]],[[3,3],[5,5]],[[5,5],[7,7]]] 不安全,因为如果原始列表为空,它会抛出异常。

答案 1 :(得分:3)

let xs = [[1,1], [3,3], [5,5], [7,7]] in zipWith (\a b -> [a,b]) xs (tail xs)
-- [[[1,1],[3,3]],[[3,3],[5,5]],[[5,5],[7,7]]]