用Haskell中的一个元素替换子列表的智能方法

时间:2012-07-05 23:20:36

标签: algorithm list haskell

我在Haskell中定义了两种类型 - TripTour。旅行包括directiondistanceprice。巡回赛是一系列旅行。

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 目的地, to 目的地和{{ 1}}并且该功能用{{替换 Trip from 目的地之间的全部 Trip序列1}}, to 之后开始,并获得更改后的Trip

以下是上面定义的游览示例:

from

所以新巡演的开头应该是这样的:

Tour

如果shortenTour :: Tour -> String -> String -> Trip -> Tour shortenTour tour "NY" "London" ("NY-London", 260, 200) 中的其他任何地方都符合此序列“NY” - .. - “London”,则应使用新[("NY", 50, 100), ("NY-London", 260, 200), ... , ("Rome", 90, 100)] 进行更改。

如果在遇到 Tour 目的地之前有两次或多次具有相同 Trip 目的地(例如“NY”)的旅行首先应该采取 from 。例如:( tofrom未被使用,因此我将其替换为_)

distance

应该返回

price

所有出现在我身上的解决方案都很漫长而且有点丑陋,但我相信有一种聪明而短暂的(一行或两行代码)方法可以通过使用列表推导来实现这一目标,但仍然无法弄明白。所以任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

我的Haskell现在非常粗糙,但你要找的是:

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

然后你可以加入前缀,快捷方式和后缀(尾部),以获得你想要的东西。