ポッドキャスト フィードを扱うアプリケーションを書きたいとします。このようなフィードから解析された情報を保存するには、次のように記述します。
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 Podcast
I already need the list of Episodes but to define an Episode
entity I need the Podcast
entity. Haskellでは、この循環依存関係を解決することは不可能だと私には思えます...
また、上記のコードは、他の言語でのプログラミングの遺物だと思います。上記のスタイルでは、たとえば python で行いますが、このプログラミング言語には状態の概念があります。Python では、最初にエピソードのないエンティティを定義し、定義されたエンティティでPodcast
すべてのエピソードを初期化し、ポッドキャストのフィールドをエピソードのリストに設定できます。Podcast
episodes
私の質問:ポッドキャストとエピソードの間の 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 でこれらの関係を定義する方法の主な問題は同じままです)。