3

Haskell で 2 つの型を定義しました -TripTour. トリップはdirectiondistanceおよびで構成され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 つ取る関数を用意することですTourfromこのto関数は、と目的地の間のすべての Trip シーケンスを にTrip置き換え、 の直後から開始し、変更された を取得します。 fromtoTripfromTour

上で定義したツアーの例を次に示します。

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必要があります。例: (distancepriceは使用されないため、 _ に置き換えています)

shortenTour [("DC", _, _), ("NY", _, _), ("NY", _, _), ("Sofia", _, _), ("London", _, _)] "NY" "London" ("NY-London", 260, 200) 

戻るべき

[("DC", _, _), ("NY", _, _), ("NY-London", 260, 200)]  

私に思いついたすべての解決策は長くて少し醜いですが、リスト内包表記を使用してこれを達成するスマートで短い (1 行または 2 行のコード) 方法があると思いますが、それでもそれを理解することはできません。そのため、どんな助けでも大歓迎です。

4

1 に答える 1