我在 Haskell 中定义了 2 种类型 -Trip
和Tour
. 旅行由direction
和distance
组成price
。Tour 是旅行的列表。
type Trip = (String, Integer, Float)
type Tour = [Trip]
trip1 :: Trip
trip1 = ("NY", 50, 100)
trip2 :: Trip
trip2 = ("Paris", 150, 100)
trip3 :: Trip
trip3 = ("London", 60, 100)
...
...
tripN :: Trip
tripN = ("Rome", 90, 100)
tour :: Tour
tour = [trip1, trip2, trip3,..., tripN]
行程可能有重复。我想在这里完成的是具有一个接受一个Tour
,from
destination,to
destination 和 a的函数,并且该函数将所有Trip 序列Trip
替换为 the和destinations之间的,从 之后开始,并获取更改的。 from
to
Trip
from
Tour
这是上面定义的游览的示例:
shortenTour :: Tour -> String -> String -> Trip -> Tour
shortenTour tour "NY" "London" ("NY-London", 260, 200)
所以新巡回赛的开始应该是这样的:
[("NY", 50, 100), ("NY-London", 260, 200), ... , ("Rome", 90, 100)]
如果这个序列 "NY" - .. - "London" 在其他任何地方遇到,Tour
它应该用新的Trip
..
如果在到达目的地之前有两个或多个from
目的地相同(例如“纽约”)的旅行,则应采取to
第一个。from
例如:(distance
andprice
没有使用,所以我用 _ 替换它们)
shortenTour [("DC", _, _), ("NY", _, _), ("NY", _, _), ("Sofia", _, _), ("London", _, _)] "NY" "London" ("NY-London", 260, 200)
应该返回
[("DC", _, _), ("NY", _, _), ("NY-London", 260, 200)]
我想到的所有解决方案都很长而且有点难看,但我相信有一种聪明而简短(一两行代码)的方法可以通过使用列表推导来实现这一点,但仍然无法弄清楚。因此,我们将不胜感激任何帮助。