我无法在 Haskell 中建模数据结构。假设我正在经营一家动物研究机构,我想跟踪我的老鼠。我想跟踪老鼠被分配到笼子和实验中的情况。我还想记录我的老鼠的重量,我的笼子的体积,并记录我的实验。
在 SQL 中,我可能会这样做:
create table cages (id integer primary key, volume double);
create table experiments (id integer primary key, notes text)
create table rats (
weight double,
cage_id integer references cages (id),
experiment_id integer references experiments (id)
);
(我意识到这允许我将来自不同实验的两只老鼠分配到同一个笼子里。这是有意的。我实际上并没有经营动物研究机构。)
两个必须可能的操作:(1)给定一只老鼠,找出它笼子的体积;(2)给定一只老鼠,得到它所属实验的笔记。
在 SQL 中,那些将是
select cages.volume from rats
inner join cages on cages.id = rats.cage_id
where rats.id = ...; -- (1)
select experiments.notes from rats
inner join experiments on experiments.id = rats.experiment_id
where rats.id = ...; -- (2)
我如何在 Haskell 中建模这个数据结构?
一种方法是
type Weight = Double
type Volume = Double
data Rat = Rat Cage Experiment Weight
data Cage = Cage Volume
data Experiment = Experiment String
data ResearchFacility = ResearchFacility [Rat]
ratCageVolume :: Rat -> Volume
ratCageVolume (Rat (Cage volume) _ _) = volume
ratExperimentNotes :: Rat -> String
ratExperimentNotes (Rat _ (Experiment notes) _) = notes
但是这个结构不会引入一堆Cage
s 和Experiment
s 的副本吗?还是我不应该担心它并希望优化器能解决这个问题?