我会先回复您的使用意向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 运行时中的实现方式。