【问题标题】:Records in PureScriptPureScript 中的记录
【发布时间】:2015-02-08 16:07:54
【问题描述】:

我不太明白为什么会这样:

module Records where

type Element e = { element :: String, label :: String | e }
type Sel = ( value :: Number, values :: [Number] )

type Select = Element Sel

虽然上面写着Cannot unify # * with *

module Records where

type Element e = { element :: String, label :: String | e }
type Sel = { value :: Number, values :: [Number] }

type Select = Element Sel

(注意 Sel 右侧的“()”而不是“{}”。)

我在这里读到 https://leanpub.com/purescript/read#leanpub-auto-objects-and-rows forall r. { firstName :: String, lastName :: String | r } 去糖 forall r. Object (firstName :: String, lastName :: String | r)

我还是有点疑惑,为什么不能使用记录糖来扩展记录。

【问题讨论】:

    标签: records type-kinds purescript


    【解决方案1】:

    Object 类型构造函数类型行参数化。在实物符号中,Object 具有 kind # * -> *。也就是一个类型需要一行类型。

    ( value :: Number, values :: [Number] ) 表示类型行(类似于# *),因此可以将其传递给Object 来构造一个类型,即

    Object ( value :: Number, values :: [Number] )
    

    注意{ ... }只是Object类型构造函数的语法糖,所以这和

    { value :: Number, values :: [Number] }
    

    两者都具有类型*,因此将这个东西作为参数传递给Element 是没有意义的,因为Element 中的类型变量e 具有类型# *

    换句话说,第二个示例中的Element Sel 展开到

    { element :: String, label :: String | { value :: Number, values :: [Number] } }
    

    去糖

    Object (element :: String, label :: String | Object (value :: Number, values :: [Number]) )
    

    由于外排尾部的* 类型的东西而无法进行类型检查。

    【讨论】:

    • 非常感谢。这解释了一切 :) 我认为在 wiki 中有一个关于记录的条目会非常好。就像{ value :: Number, values :: [Number] } 脱糖一样。以及如何扩展记录的示例将非常有帮助。再次感谢
    • 没问题。如果您愿意,请随意将其复制到 wiki 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多