gpt4 book ai didi

haskell - 在 Haskell 中定义数据结构的建议

转载 作者:行者123 更新时间:2023-12-03 13:54:07 24 4
gpt4 key购买 nike

我无法在 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年代?还是我不应该担心它并希望优化器能解决这个问题?

最佳答案

这是我用于测试的一个短文件:

type Weight = Double
type Volume = Double

data Rat = Rat Cage Experiment Weight deriving (Eq, Ord, Show, Read)
data Cage = Cage Volume deriving (Eq, Ord, Show, Read)
data Experiment = Experiment String deriving (Eq, Ord, Show, Read)

volume = 30
name = "foo"
weight = 15
cage = Cage volume
experiment = Experiment name
rat = Rat cage experiment weight

然后我启动ghci并导入 System.Vacuum.Cairo ,可从令人愉快的 vacuum-cairo 获得包裹。
*Main System.Vacuum.Cairo> view (rat, Rat (Cage 30) (Experiment "foo") 15)

not-shared
*Main System.Vacuum.Cairo> view (rat, Rat (Cage 30) experiment 15)

shared-experiment

(我不太确定为什么这个箭头是双箭头,但你可以忽略/折叠它们。)
*Main System.Vacuum.Cairo> view (rat, Rat cage experiment weight)

shared-args
*Main System.Vacuum.Cairo> view (rat, rat)

shared-all
*Main System.Vacuum.Cairo> view (rat, Rat cage experiment (weight+1))

shared-modified

如上所示,经验法则是,当您调用构造函数时,会准确地创建新对象。否则,如果您只是命名一个已经创建的对象,则不会创建新对象。在 Haskell 中这样做是安全的,因为它是一种不可变的语言。

关于haskell - 在 Haskell 中定义数据结构的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com