[英]How to Access Fields of Custom Data Types without Record Syntax in 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
区分开来。
现在,对于任何特定a
, MyType 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)
- 具有相同a
和b
。
因此,如果您只想从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.