【发布时间】:2012-07-05 23:20:36
【问题描述】:
我在 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 目的地、to 目的地和Trip 的功能,并且该功能替换为 所有 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。
如果在到达 to 目的地之前有两个或多个行程具有相同的 from 目的地(例如“纽约”),则第一个 应该采取from。例如:(distance 和 price 没有使用,所以我用 _ 替换它们)
shortenTour [("DC", _, _), ("NY", _, _), ("NY", _, _), ("Sofia", _, _), ("London", _, _)] "NY" "London" ("NY-London", 260, 200)
应该返回
[("DC", _, _), ("NY", _, _), ("NY-London", 260, 200)]
我想到的所有解决方案都很长而且有点难看,但我相信有一种聪明而简短(一两行代码)的方法可以通过使用列表推导来实现这一点,但仍然无法弄清楚。因此,我们将不胜感激任何帮助。
【问题讨论】:
-
你为什么不做
data Trip = Trip { tripDirection :: String, tripDistance :: Double, tripPrice :: Int }?这样它就解释了自己。Typedef-ing 元组令人困惑并使许多事情变得更加复杂,因为您不能使用记录语法。 -
你说的有道理,但决定使用类型、数据还是元组的不是我。这是任务中给定的。