【问题标题】:Smart way to replace sublist with one element in Haskell在 Haskell 中用一个元素替换子列表的智能方法
【发布时间】: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 元组令人困惑并使许多事情变得更加复杂,因为您不能使用记录语法。
  • 你说的有道理,但决定使用类型、数据还是元组的不是我。这是任务中给定的。

标签: algorithm list haskell


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的讲义 :) 我不确定我是否可以在任务中使用尾部(可能只使用 Prelude 模块),但我明白了基本的想法。我会尝试想出一些解决方法。
猜你喜欢
  • 2021-05-19
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2012-01-18
  • 2022-10-20
相关资源
最近更新 更多