想象一下,我想编写一个处理播客提要的应用程序。为了存储来自此类提要的解析信息,我会编写如下内容:
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 方法是什么?
评论中问题的回答:
循环依赖在 Haskell 中实际上非常简单。在一个let
声明中,任何绑定的定义都可以引用任何其他绑定。
let pc = Podcast "the name" [ep1, ep2]
ep1 = Episode "first" pc
ep2 = Episode "second" pc
懒惰会帮你解决这个问题。
但作为一般规则,DBMS 是此类信息的最佳选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)