Haskell で 2 つの型を定義しました -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]
旅行は重複している可能性があります。ここで達成したいのは、目的地、目的地、および を 1 つ取る関数を用意することですTour
。from
このto
関数は、と目的地の間のすべての Trip シーケンスを に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
。
from
目的地に到着する前に、同じ目的地 (例: "NY")への旅行が 2 回以上ある場合はto
、最初の旅行を利用するfrom
必要があります。例: (distance
とprice
は使用されないため、 _ に置き換えています)
shortenTour [("DC", _, _), ("NY", _, _), ("NY", _, _), ("Sofia", _, _), ("London", _, _)] "NY" "London" ("NY-London", 260, 200)
戻るべき
[("DC", _, _), ("NY", _, _), ("NY-London", 260, 200)]
私に思いついたすべての解決策は長くて少し醜いですが、リスト内包表記を使用してこれを達成するスマートで短い (1 行または 2 行のコード) 方法があると思いますが、それでもそれを理解することはできません。そのため、どんな助けでも大歓迎です。