【问题标题】:Solve cyclic dependencies in haskell data records解决haskell数据记录中的循环依赖
【发布时间】:2014-05-06 22:44:22
【问题描述】:

假设我想编写一个处理播客提要的应用程序。为了存储来自这样一个提要的解析信息,我会写这样的东西:

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 关系:一个播客有很多集,而集属于一个播客。现在我在定义此类播客时遇到了问题:请定义Podcast 我已经需要剧集列表,但要定义Episode 实体,我需要Podcast 实体。在我看来,在 haskell 中解决这种循环依赖是不可能的......

我也认为上面的代码是我用其他语言编程的遗留物。在上述风格中,我会以 python 为例,但这种编程语言有一个状态的概念。在 python 中,我可以首先定义一个没有剧集的Podcast 实体,然后使用定义的Podcast 实体初始化所有剧集,然后将播客的episodes 字段设置为剧集列表。

我的问题: 对播客和剧集之间的 1:n 关系建模的 Haskell 方法是什么?

对 cme​​ts 中问题的回答:

为什么一集必须引用特定的播客?如果有函数就好了

podcast :: Episode -> Podcast

它会在我需要时返回剧集的播客。我知道,一种解决方案是将Podcast 实体也传递给剧集的每个函数,即我替换每个函数

func1 :: Episode -> Something

我需要上述podcast 函数的地方

func1 :: Podcast -> Episode -> Something

如果编写尽可能少的代码并且不必到处携带Podcast 实体,那就太好了。

也许我稍微改变一下我的问题:在没有 podcast 字段的情况下定义 Episode 数据记录是完全可以的。如何实现

podcast :: Episode -> Podcast

在这种情况下?

如果有人稍后制作包含其他播客的剧集的播客怎么办?在我的情况下,这不会发生,即使是这样,考虑相同的剧集也是完全可以的作为不同的。 (事实上​​,考虑到这个问题会将 1:n 关系提升为 n:n 关系,但如何在 haskell 中定义这些关系的主要问题仍然是相同的)。

【问题讨论】:

  • 为什么一集必须引用特定的播客?如果有人稍后制作了包含其他播客的剧集的播客怎么办?
  • @JAB:我编辑我的问题并回答你的问题......

标签: haskell record cyclic-dependency


【解决方案1】:

循环依赖在 Haskell 中实际上非常简单。在let 语句中,任何绑定的定义都可以引用任何其他绑定。

let pc = Podcast "the name" [ep1, ep2]
    ep1 = Episode "first" pc
    ep2 = Episode "second" pc

懒惰会为你解决这个问题。

但作为一般规则,DBMS 是此类信息的最佳选择。

【讨论】:

  • 感谢您的快速回答!什么是 DBMS?
猜你喜欢
  • 2016-08-27
  • 2020-11-12
  • 1970-01-01
  • 2013-02-04
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多