haskell中的参数化数据结构

haskell中的参数化数据结构,haskell,parameterized,Haskell,Parameterized,您能建议如何在haskell中表示参数化数据结构吗?e、 g.在一个表示服装店内容的应用程序中,我可能有男装和女装货架的实例。这些参数可以是分层的,例如基于年龄组。所以我可以有一个架子(男人(14岁以下)),或者一个架子(女人(成人))。此外,一些约束可能适用于机架参数,例如,没有婴儿服装。与java类一样,我需要一些在这些实例上操作的成员函数。这样的函数怎么样: data Rack = Rack {allClothesOnRack :: [Clothing],

您能建议如何在haskell中表示参数化数据结构吗?e、 g.在一个表示服装店内容的应用程序中,我可能有男装和女装货架的实例。这些参数可以是分层的,例如基于年龄组。所以我可以有一个架子(男人(14岁以下)),或者一个架子(女人(成人))。此外,一些约束可能适用于机架参数,例如,没有婴儿服装。与java类一样,我需要一些在这些实例上操作的成员函数。

这样的函数怎么样:

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)