4

ポッドキャスト フィードを扱うアプリケーションを書きたいとします。このようなフィードから解析された情報を保存するには、次のように記述します。

data Podcast = Podcast {
    podcastTitle :: String, -- ^ title of podcast
    episodes :: [Episode]   -- ^ list of episodes of podcast
    ...                     -- ^ some other fields
} deriving (Show)

data Episode = Episode {
    episodeTitle :: String, -- ^ title of episode
    podcast :: Podcast      -- ^ podcast this episode belongs to
    ...                     -- ^ some other fields
} deriving (Show)

上記のデータ レコードの定義は、データ型間の一般的な 1:n の関係を反映しています。ポッドキャストには多くのエピソードがあり、エピソードは 1 つのポッドキャストに属します。今、そのようなポッドキャストを定義する際に問題があります: Do define a PodcastI already need the list of Episodes but to define an Episodeentity I need the Podcastentity. Haskellでは、この循環依存関係を解決することは不可能だと私には思えます...

また、上記のコードは、他の言語でのプログラミングの遺物だと思います。上記のスタイルでは、たとえば python で行いますが、このプログラミング言語には状態の概念があります。Python では、最初にエピソードのないエンティティを定義し、定義されたエンティティでPodcastすべてのエピソードを初期化し、ポッドキャストのフィールドをエピソードのリストに設定できます。Podcastepisodes

私の質問:ポッドキャストとエピソードの間の 1:n 関係をモデル化する Haskell の方法は何ですか?

コメントの質問への回答:

エピソードが特定のポッドキャストを参照する必要があるのはなぜですか? 機能があればいいのに

podcast :: Episode -> Podcast

必要なときにいつでもエピソードのポッドキャストを返します。1つの解決策は、エピソードの各関数にエンティティも渡すことPodcastです。つまり、各関数を置き換えます

func1 :: Episode -> Something

podcast上記の関数が必要な場所

func1 :: Podcast -> Episode -> Something

できるだけ少ないコードを記述し、Podcastエンティティをどこにでも持ち運ぶ必要がないようにすることは、素晴らしいことです。

質問を少し変更するかもしれません。フィールドEpisodeなしでデータ レコードを定義してもまったく問題ありません。podcastどのように実装できますか

podcast :: Episode -> Podcast

この場合?

誰かが後で他のポッドキャストのエピソードを含むポッドキャストを作成した場合はどうなりますか? 私の場合はそうはなりませんし、仮にそうであったとしても、同じエピソードを別のエピソードと考えても全く問題ありません。(実際、この問題を考慮すると、1:n 関係が n:n 関係に持ち上げられますが、haskell でこれらの関係を定義する方法の主な問題は同じままです)。

4

1 に答える 1