haskell中的参数化数据结构
您能建议如何在haskell中表示参数化数据结构吗?e、 g.在一个表示服装店内容的应用程序中,我可能有男装和女装货架的实例。这些参数可以是分层的,例如基于年龄组。所以我可以有一个架子(男人(14岁以下)),或者一个架子(女人(成人))。此外,一些约束可能适用于机架参数,例如,没有婴儿服装。与java类一样,我需要一些在这些实例上操作的成员函数。这样的函数怎么样:haskell中的参数化数据结构,haskell,parameterized,Haskell,Parameterized,您能建议如何在haskell中表示参数化数据结构吗?e、 g.在一个表示服装店内容的应用程序中,我可能有男装和女装货架的实例。这些参数可以是分层的,例如基于年龄组。所以我可以有一个架子(男人(14岁以下)),或者一个架子(女人(成人))。此外,一些约束可能适用于机架参数,例如,没有婴儿服装。与java类一样,我需要一些在这些实例上操作的成员函数。这样的函数怎么样: data Rack = Rack {allClothesOnRack :: [Clothing],
data Rack = Rack {allClothesOnRack :: [Clothing],
withClothing :: Clothing -> Maybe Rack,
withoutClothing :: Clothing -> Maybe Rack}
emptyRack :: (Clothing -> Bool) -> Rack
emptyRack isAcceptable = rack isAcceptable []
rack :: (Clothing -> Bool) -> [Clothing] -> Rack
rack isAcceptable = updated
where updated items = Rack {allClothesOnRack = items,
withClothing = adding,
withoutClothing = removing}
adding item | isAcceptable item = Just $ updated (item : items)
| otherwise = Nothing
removing item -- left as an exercise
您可以创建一个衣架
,该衣架具有一个指定是否可以将特定衣物放在衣架上的功能。此函数可以使用它喜欢的衣服
(在我的示例中未定义)的任何属性
e、 g.如果isBabyClothing::Clothing->Bool
在给定一件婴儿服装时返回True
,则使用emptyRack isBabyClothing
创建一个空的婴儿衣架
使用allClothesOnRack
功能获取衣架上所有衣服的列表
e、 g.allClothesOnRack(emptyRack是babyclockthing)
将始终生成[]
使用带衣物
和不带衣物
功能向机架添加/从机架中移除衣物。如果这不可能,他们每个人都会返回Nothing
(衣服可能没有放在架子上,或者它不在架子上,因此无法移除),或者只返回更新的架子,否则
与Java类一样,我需要一些对这些实例进行操作的成员函数
在Haskell中,没有“成员”函数。所有函数都只是函数
您能建议如何在haskell中表示参数化数据结构吗
当然。首先,Rack
听起来像是一个列表,因此您可以创建一个类型同义词
type Rack a = [a]
我将向您介绍Haskell的一些功能,我认为这些功能可能对您有用。这不是唯一的方法,但我认为这是一个不错的开始。第一个特性称为代数数据类型(ADT):
类型性别
有两种可能性,男性
和女性
。这个特殊的例子基本上是伪装的Bool
。另一个ADT:
data Age = Baby | Child | PreTeen | Adult
deriving (Eq, Show, Ord)
我不是服装尺寸专家,所以必要时调整一下。注意,我已经导出了(Eq,Show,Ord)
Eq
允许我们对该数据类型的值使用=
,Show
允许我们对该数据类型的值使用Show
(类似于toString
),而Ord
允许我们使用比较运算符。根据我提供的定义,Baby
将评估为True
现在,那么。让我们将服装定义为另一种ADT。(--
以单行注释开头)
在这里,我将字段添加到选项中。您可以使用其中一个构造函数创建一件衣服。例如,Shirt-Male-Baby
创建类型为Clothing
的值
在继续学习Haskell的过程中,您可能希望尝试使用通用代数数据类型(GADTs)和类型类。如果您希望创建一个机架
数据类型,并且该数据类型上的函数利用机架类型来保留谓词,例如“此机架仅包含成人男性服装”,则可能需要使用这些功能。然而,我想这些事情现在有点让你不知所措;相反,请尝试dave对我的数据类型的方法,并向Haskell介绍一些很好的介绍材料,例如。我不确定您想要实现什么。你的问题很模糊,用面向对象的术语表达,这对Haskell来说并不适用。由于您的问题被标记为template haskell,您打算如何使用template haskell?一些具体的例子会有所帮助。删除了模板Haskell标记,因为它几乎肯定不是Rog想要的。代数数据类型似乎不能很好地表示性别。
data Age = Baby | Child | PreTeen | Adult
deriving (Eq, Show, Ord)
data Clothing = Pants Gender Age
| Shirt Gender Age
| Skirt Age -- assumed to be Female
deriving (Show, Eq)