繁体   English   中英

如何在 Haskell 的自定义数据类型中使用语法和访问值?

[英]How to use the syntax and access values in custom data types in Haskell?

我的数据类型定义如下:

data MyType a = MyType Weight [a]

并且重量是type Weight = Integer.

我不完全明白这里发生了什么。 MyType是否由 integer 或[a]或两者组成?

就我而言,我得到MyType (a,b) ,我想知道,这是(a,b)的列表,如果是,我需要使用什么语法才能仅提取列表a

MyType是由Int[a]组成的类型,因此两者都有。 要从类型中提取列表,可以使用模式匹配:

getList :: MyType a -> [a]
getList (MyType _ a) = a

或者,您可以使用记录语法声明类型:

data MyType a = MyType { getWeight :: Weight, getList :: [a] }

它会自动生成解包函数,因此getList (MyType 2 [3,4]) == [3,4])

正如你所说,

data MyType a = MkMyType Weight [a]

定义数据类型。 请注意,我做了一个小改动,将MkMyType写在=的右侧,以将其与左侧的MyType区分开来。

现在,对于任何特定aMyType a是一种数据类型——它是一种可以出现在定义右侧的东西。

MkMyType:: Weight -> [a] -> MyType a是一个数据构造函数。 应用于一个Weight类型的值和一个[a]类型的值,它会创建一个MyType a类型的值,它确实同时持有两个值——一个Weight类型的值和一个[a] -type 值,在创建时赋予它。

这个值如何在计算机 memory 中表示,并不重要。 重要的是我们可以对它进行模式匹配,例如

foo :: MyType a -> (Weigth, [a])
foo (MkMyType w as) = (w, take 1 as)

请注意,在值bar = MkMyType w as我们有Weight类型的值w (我们写: w:: Weight )并且我们也as [a]类型的值 - 与bar中出现的a相同类型。

因此我们也可以定义

baz :: MyType (a,b) -> (Weigth, [(a,b)])
baz (MkMyType w abs) = (w, take 2 abs)

同样,这里我们有abs:: [(a,b)]因为参数值的类型是MyType (a,b) - 具有相同ab

因此,如果您只想从abs中获取 s a列表——不仅是它的两个 head 元素,而是所有这些元素——你可以写

quiz :: MyType (a,b) -> [a]
quiz (MkMyType _ abs) = takeFirsts abs

在这里你需要实施

takeFirsts :: [(a,b)] -> [a]
takeFirsts abs = ...

我留给你完成,作为练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM