在 Elm 中,“number”是什么?

7
我对于 `number` 这个东西感到困惑。它似乎是一种类型,类似于 `Int` 和 `Float` 的上级类型,就像 java.lang.Number,但是:
  • 它的拼写是小写的,因此在语法上类似于值的名称(我使用 'value' 来避免使用 'constant variable')
  • 事实上我们可以声明一个名为 `number` 的值。

观察下面的例子:

> 1024
1024 : number
> 1024.0
1024 : Float
> floor(1024)
1024 : Int

让我们使用一个值的名称number

> number = 144
144 : number
> number
144 : number
> number = floor(144)
144 : Int
> number
144 : Int

并且:

还有:

> Result.Ok 12 
Ok 12 : Result error number
> Result.Ok 12.0 
Ok 12 : Result error Float
> Result.Ok (floor 12) 
Ok 12 : Result error Int

number是什么?

它是一个笨拙地命名的联合类型吗?还是语法上的不幸之处?

(奇思妙想:为什么不为“来自类型宇宙的事物”和“来自元类型宇宙的事物”分别设置特殊语法,比如↑Int⇈X。由于设计上缺少注释,Elm有时很难理解。)

1个回答

8
据我所了解,number是一种内置类型类,类似于Java中描述实现该接口的类型可以执行哪些操作的接口。但是,在Java中,消费者视角下的接口被指定为普通类型,而类型类是对类型变量的约束,采用“魔法”类型变量名称(如numbercomparable)按照惯例来指定。
在具有“正式”类型类支持的语言中,例如Haskell,您将单独指定约束,即Number a => a -> a。但是在Elm中,只有一些内置类型类,认为必须学习该概念和语法才能使用一些相当直观的内置类型类是不必要的负担。虽然您可能无法直观地理解其确切含义,但您应该足够了解它,以至少能够使用大多数以numbercomparable为参数的函数。其确切含义稍后可以解释(尽管我有时会想知道官方解释会延迟多长时间...)。
我希望这足以回答您的问题,但如果仍不清楚,请告诉我。

1
谢谢。所以它是一个实用的“描述”,它做到了它的名字所暗示的。我可以接受这个。我在这里找到了关于“约束类型变量”的小章节:阅读类型 - David Tonhofer
啊,谢谢,我之前不知道这个。它一定是在0.19更新指南时添加的。所以现在至少有_一些_官方信息了 :) - glennsl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接