3

我在 Haskell 中定义了 2 种类型 -TripTour. 旅行由directiondistance组成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]

行程可能有重复。我想在这里完成的是具有一个接受一个Tourfromdestination,todestination 和 a的函数,并且该函数将所有Trip 序列Trip替换为 the和destinations之间的,从 之后开始,并获取更改的。 fromtoTripfromTour

这是上面定义的游览的示例:

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例如:(distanceandprice没有使用,所以我用 _ 替换它们)

shortenTour [("DC", _, _), ("NY", _, _), ("NY", _, _), ("Sofia", _, _), ("London", _, _)] "NY" "London" ("NY-London", 260, 200) 

应该返回

[("DC", _, _), ("NY", _, _), ("NY-London", 260, 200)]  

我想到的所有解决方案都很长而且有点难看,但我相信有一种聪明而简短(一两行代码)的方法可以通过使用列表推导来实现这一点,但仍然无法弄清楚。因此,我们将不胜感激任何帮助。

4

1 回答 1

1

这些天我的 Haskell 非常粗糙,但您正在寻找的是:

  • 以 -- 结尾的最短前缀,from您可以使用 takeWhile;
  • 最长的后缀以 开头to,但不包含其他to- 您可以使用tails过滤器来获得它。

然后你可以加入前缀、你的快捷方式和后缀的(尾部)来得到你想要的。

于 2012-07-06T01:31:42.297 回答