给出一些像这样的类型签名:
type Foo = { name : String }
getFooName : Foo -> String
getName : { a | name : String } -> String
是否可以推断可以使用getName
代替getFooName
?
答案 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>
。