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

我正在阅读,想更好地了解Elm中的标记工会。具体来说,我遇到了这个例子:

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
    分支通常会对您无法获得该值的原因进行某种解释。