Elm - 检查值的类型

2024-04-08

是否存在检查 Elm 中变量类型的函数?例如(重复):

numberTwo = 2
.....
returnType numberTwo
"number" : String

这样做的动机是当你使用Signal.map[n]通常会出现这样的情况:并非所有要应用的函数的参数都是信号 - 然后它们通常必须使用“提升”为信号Signal.constant- 如果我可以检查此类参数的类型,我可以创建一个函数Signal.allSigMap[n]这会自动将这些参数转换为信号。

So

Signal.map2 grandFatherClock clockSignalElement (Signal.constant cabinetElement)

becomes

Signal.allSigMap2 grandFatherClock clockSignalElement cabinetElement

但可能是不好的做法。请告诉我。


我会先回复您的使用意向returnType作为必要的推广类型的一种方式Signal。这将意味着returnType或沿途的其他一些函数实际上返回一个类型而不是String因为没有其他方法可以让类型检查器满意。

这样的功能在现在的 Elm 中不存在也不可能存在。您要求的是可以检查值编译时的类型,然后在该类型上运行函数的东西。

为了了解为什么这与 Elm 中当前存在的任何内容完全不同,我们假设存在这样一个函数。

returnType : a -> ?

我们立即面临第一个问题:到底什么是类型?returnType。假设我们有一个适用于所有类型的类型,称为Type(它有自己的一套逻辑问题,我们将其放在一边)。

returnType : a -> Type

我们实际如何使用这个功能呢?据推测,它能够进入类型签名,因为它返回一个类型。

 x : returnType 5

Now that是与 Elm 中其他所有内容完全不同的类型签名。有一个数字文字(和一个函数)!突然之间你就可以开始写这样的东西了。

y = 5

x : returnType y
x = 6

这远远超出了 Elm 类型系统的能力范围。这种(令人兴奋且强大的)类型级别和价值级别的混合被称为依赖类型 https://en.m.wikipedia.org/wiki/Dependent_type并且不存在主流的完全依赖类型语言;最接近主流的可能是 Coq、Agda、Idris 和 ATS,它们都相当晦涩难懂。

至于字面上所说的具有函数的问题returnType : a -> String打印出表示值类型的字符串,这在 Elm 中也是不可能的,尽管出于其他原因。这样的函数(其应用发生在运行时)必须能够重建有关运行时值的类型信息,但 Elm 的运行时值只是 Javascript 值;他们已经失去了榆树类型。您必须从 Javascript 值重建原始 Elm 类型(并不总是可行,因为不同的类型最终可能会成为相同的 Javascript 值)或拥有特殊的编译器支持。

对于 Elm REPL,选择后者。整个 REPL 是用 Haskell 编写的,并利用了 Elm 类型在 Haskell 运行时中的实现方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elm - 检查值的类型 的相关文章