DW 2.0 中的多态性
Polymorphism in DW 2.0
我最近意识到在 DW 2.0 中使用类似泛型的表示法来表示多态类型。
下面的例子
%dw 2.0
output application/dw
fun id1(a) = a
fun id2(a: Any) = a
fun id3<T>(a: T) = a
var id4 = <T>(a: T) -> a
---
{
"d1": id1,
"d2": id2,
"d3": id3,
"d4": id4,
r1: id1(10),
r2: id2(10),
r3: id3(10),
r4: id4(10)
}
说明这些函数的签名和语义是相同的。
这引出了一个问题,如果有的话,这些定义之间有什么区别?你会推荐哪一个?
最后,确认我的假设,即 DW 2.0 借用了 OO 语言中的这种类泛型语法来支持显式多态类型。
注意:我确实使用 application/dw
来查看函数的信号,而 运行 来自 Anypoint Studio 的预览
TIA!
DataWeave 中 parametric polymorphism
最常见的用途之一是反映类型系统函数,其中 return 类型取决于其输入。
当实现相同且仅签名不同时,这有助于避免为每种可能的输入类型创建专门的函数。
请注意,此功能仅在 type-checking 期间相关,此信息不会在运行时携带。
在你的例子中:
id1
将从 id1
函数的用法中推断出 a
的类型,并且还将推断出 return 类型,因为它们未指定。
id2
将推断 return 类型是 Any
类型
id3
和id4
是一样的,return和a
的类型取决于你调用的函数。
为了举例说明 Any
和 T
之间的区别,您可以尝试:
// var fails: String = id2("foo")
var ok: String = id3("foo")
由于 id2
的结果不能分配给 String
因为它是 Any
,但是 id3
return 是 String
因为它被赋予了 String
作为输入。
我最近意识到在 DW 2.0 中使用类似泛型的表示法来表示多态类型。
下面的例子
%dw 2.0
output application/dw
fun id1(a) = a
fun id2(a: Any) = a
fun id3<T>(a: T) = a
var id4 = <T>(a: T) -> a
---
{
"d1": id1,
"d2": id2,
"d3": id3,
"d4": id4,
r1: id1(10),
r2: id2(10),
r3: id3(10),
r4: id4(10)
}
说明这些函数的签名和语义是相同的。
这引出了一个问题,如果有的话,这些定义之间有什么区别?你会推荐哪一个?
最后,确认我的假设,即 DW 2.0 借用了 OO 语言中的这种类泛型语法来支持显式多态类型。
注意:我确实使用 application/dw
来查看函数的信号,而 运行 来自 Anypoint Studio 的预览
TIA!
DataWeave 中 parametric polymorphism
最常见的用途之一是反映类型系统函数,其中 return 类型取决于其输入。
当实现相同且仅签名不同时,这有助于避免为每种可能的输入类型创建专门的函数。
请注意,此功能仅在 type-checking 期间相关,此信息不会在运行时携带。
在你的例子中:
id1
将从id1
函数的用法中推断出a
的类型,并且还将推断出 return 类型,因为它们未指定。id2
将推断 return 类型是Any
类型
id3
和id4
是一样的,return和a
的类型取决于你调用的函数。
为了举例说明 Any
和 T
之间的区别,您可以尝试:
// var fails: String = id2("foo")
var ok: String = id3("foo")
由于 id2
的结果不能分配给 String
因为它是 Any
,但是 id3
return 是 String
因为它被赋予了 String
作为输入。