如何在Haskell中建模记录存储
我想在Haskell建立一个唱片店的模型。实际上销售记录并不重要,我主要想关注的是如何建立库存管理模型和跟踪销售。我的问题描述如下:如何在Haskell中建模记录存储,haskell,haskell-platform,Haskell,Haskell Platform,我想在Haskell建立一个唱片店的模型。实际上销售记录并不重要,我主要想关注的是如何建立库存管理模型和跟踪销售。我的问题描述如下: 记录艺术家姓名和曲目标题下的单曲销售 返回给定艺术家姓名和曲目标题的曲目总销量。 (如果没有匹配的曲目,则应返回0。) 从销售记录中删除给定艺术家姓名和曲目标题的曲目 如何开始?因此,首先,您可以查看问题描述,突出显示构成问题域的名词和动词:销售、跟踪、跟踪标题、艺术家、销售数量、销售记录。然后,我可能会首先为最核心的概念定义一种数据类型: 导入数据。文本(Tex
(如果没有匹配的曲目,则应返回0。)
如何开始?因此,首先,您可以查看问题描述,突出显示构成问题域的名词和动词:销售、跟踪、跟踪标题、艺术家、销售数量、销售记录。然后,我可能会首先为最核心的概念定义一种数据类型:
导入数据。文本(Text)
类型标题=文本
类型艺术家=文本
数据轨道=轨道
{trackTitle::Title
,轨迹艺术家::艺术家
}推导(Eq、Ord、Show)
最佳跟踪,好跟踪::跟踪
最佳跟踪
{trackTitle=“这就是我的生活”
,trackArtist=“jon bovi”
}
okayTrack=轨道
{trackTitle=“住在普雷耶”
,trackArtist=“jon bovi”
}
您也可以用大致相同的方式定义销售
也许你想用这个软件包来模拟价格
进口货币
类型价格=密集“美元”
数据销售=销售
{saleTrack::Track
,salePrice::价格
}
销售::[销售]
销售=
[Sale{saleTrack=bestTrack,salePrice=399%100}
,Sale{saleTrack=okayTrack,salePrice=284%100}
]
这些是名词。动词“添加/删除销售记录”可以制成函数。如果销售是一个列表,则添加和删除销售记录将成为对列表进行操作的递归函数:
addSale::Track->Price->[Sale]->[Sale]
addSale soldTrack soldPrice existingSales=。。。
removeSale::Title->[销售]->[销售]
removeSale标题existingSales=。。。
在编写这些函数的过程中,您还可以通过制定有关它们的属性来测试它们:例如:将销售添加到现有的销售列表中,生成的列表应该比现有的销售列表大一倍。从空销售列表中删除销售应该产生错误,或者复制空销售列表(decise)。从非空的销售列表中删除销售应生成一个少一个销售的列表。从包含相同曲目标题的销售列表中删除两次销售只应删除其中一个(哪个?决定)。添加和删除一个曲目应产生与添加之前相同的销售列表
从这些属性可以构造单元测试或属性测试
当你为商店之类的东西建模时,你也可以深入到好的实践中去,例如,记录同一物品的不同价格可能是不好的,因此你可能想发明一个产品代码。为一家商店做好建模是一个兔子洞,因此如果你只是想做一个愚蠢的概念证明来覆盖最可能的领域,比如最终达到一个UI,那么这部分可能并不重要。当你问有关StackOverflow的问题时:跳过“我知道的不多”,确保你内联了实际的问题描述;链接到图像有两个问题:一个问题是搜索引擎无法轻松扫描图像,因此其他人无法找到您的问题。另一个问题是,如果外部图像最终丢失,这篇文章将失去所有意义,因为问题的主体除了断开的链接之外,没有任何描述。最后,经修订的问题仍然没有任何尝试。因此,也许你可以将“我该如何开始”改为“我已经尝试过了”:)考虑使用列表来存储当前的销售记录。列表中的每个元素都有艺术家、曲目名称和销售编号。1.将更新列表中的元素,2。将在元素与艺术家名称3匹配时返回值。将从列表中删除元素