是否可以从更具体的类型签名推断出一般类型签名?

时间:2018-01-26 11:34:01

标签: types

给出一些像这样的类型签名:

type Foo = { name : String }

getFooName : Foo -> String

getName : { a | name : String } -> String

是否可以推断可以使用getName代替getFooName

1 个答案:

答案 0 :(得分:0)

是。这是榆树的一个工作实例。您可以在http://elm-lang.org/try

运行它
import Html exposing (text)

type alias Foo = { name : String }

fnThatUsesAGetFooName : ( Foo -> String ) -> Foo -> String
fnThatUsesAGetFooName x foo = x foo

getName : { a | name : String } -> String
getName v = v.name

arg: Foo
arg = { name = "gmorenz" }

main = 
  text (fnThatUsesAGetFooName getName arg)

这被称为“结构类型”(我认为“行键入”)。

您还可以在类型系统中查看此问题,其中包含类似生锈的接口或类型类。为每个结构中的每个字段自动创建和实现“varname_with_type_typeid”特征(接口)与getter和setter。显然这需要扩展编译器,但由于它是一个简单的文本转换,从理论上讲它很容易。然后getName看起来像

fn getName<T: name_with_type_TypeIdOfString>(input: T) -> String { 
    t.get_name_with_type_TypeIdOfString()
}

您可以通过fn(Foo) -> String来说明getName::<Foo>