我在Haskell中定义了两种类型 - Trip
和Tour
。旅行包括direction
,distance
和price
。巡回赛是一系列旅行。
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
。例如:( to
和from
未被使用,因此我将其替换为_)
distance
应该返回
price
所有出现在我身上的解决方案都很漫长而且有点丑陋,但我相信有一种聪明而短暂的(一行或两行代码)方法可以通过使用列表推导来实现这一目标,但仍然无法弄明白。所以任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
我的Haskell现在非常粗糙,但你要找的是:
from
结尾的最短前缀 - 你可以使用它
takeWhile
; to
开头的最长后缀,但不包含
其他to
- 您可以使用带有过滤器的tails
来获取此内容。然后你可以加入前缀,快捷方式和后缀(尾部),以获得你想要的东西。