我有一个这样的清单:
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]]]
你有更清洁的解决方案吗?肯定会有更清洁的东西。
答案 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]]]