Elm中的标记工会
我正在阅读,想更好地了解Elm中的标记工会。具体来说,我遇到了这个例子:Elm中的标记工会,elm,Elm,我正在阅读,想更好地了解Elm中的标记工会。具体来说,我遇到了这个例子: type Scale = Normal | Logarithmic type Widget = ScatterPlot (List (Int, Int)) | LogData (List String) | TimePlot Scale (List (Time, Int)) 我认为它的解释如下: Scale是一种具有两个可能值的类型:Normal或对数 Widget是一种具有3个可能值的类型:Sc
type Scale = Normal | Logarithmic
type Widget
= ScatterPlot (List (Int, Int))
| LogData (List String)
| TimePlot Scale (List (Time, Int))
我认为它的解释如下:
Scale
是一种具有两个可能值的类型:Normal
或对数
Widget
是一种具有3个可能值的类型:ScatterPlot
、LogData
或TimePlot
但是,如何解释散点图中的
(List(Int,Int))
部分?类似地,我如何解释时间图
中的比例(List(Time,Int))
部分?只需将它们视为函数签名即可。所以散点图必须这样创建
ScatterPlot [(1,1), (2,2)]
当您在case
语句中进行模式匹配时
case widget of
ScatterPlot l -> l -- l is from type (List (Int, Int))
LogData l -> l -- l is from type (List String)
TimePlot l -> l -- l is from type Scale (List (Time, Int))
List
是一种内置类型,采用一个参数(另一种类型),表示“包含此类型值的列表作为其元素”。所以List(Int,Int)
是(Int,Int)
的列表。那么什么是(Int,Int)
通常,任何(a,b)
都是一个元组,其成员类型为a
和b
。元组有点像没有字段名的记录,因此您只能通过元素的位置来区分元素,但与列表不同,元素可以是不同类型的。所以(Int,Int)
是一个包含两个Int
s的元组,其中Int
只是一个整数
因此,List(Int,Int)
是两个整数的元组列表
使用TimePlot
可以获得两个不同的类型参数-Scale
和List(Time,Int)
。考虑到List(Int,Int)
的解释,后者现在应该有意义了——只是元组的第一个类型是Time
,而不是Int
因此,TimePlot
采用两种类型作为参数,它成为一个TimePlot标度(List(Time,Int))
在Elm和相关语言中,类型表示法(和函数应用)的定义使得任何表达式AB c d
表示a
,带有参数b
、c
和d
。如果cd
是一个参数,则将其放在括号中
正如Andreas所说,将联合“标记”看作函数——它们实际上是函数,事实上它们被称为“类型构造函数”
TimePlot
是一个函数,它采用比例和列表(时间,Int)
并返回小部件
Normal
是一个不带参数的函数,它返回一个比例
,以此类推。感谢您的详细解释-这非常有意义!我想我的困惑部分在于括号是如何使用的,但你的解释已经澄清了这一点!另一个相关问题,但您如何解释此类型注释:String.toInt:String->Result String Int
?我理解这一点的方式是toInt函数将字符串作为输入,并返回结果字符串Int
类型的值,对吗?但是,Result String Int
的有效值是什么样子的?Result error value
是一种指示操作结果的类型。在这种情况下,错误
是字符串
,值
是Int
,因此,如果操作没有成功,您会得到一个字符串
——可能是一条错误消息——如果是,您会得到一个Int
。这是一种有区别的联合类型,因此您可以对其进行模式匹配-成功分支为Ok
,错误分支为Err
。查看确认,然后类型结果字符串Int
的有效值可以是:错误“404发生”
和Ok 200
对吗?谢谢你的帮助!对的Ok
分支将携带您想要获得的值,而Error
分支通常会对您无法获得该值的原因进行某种解释。