Полиморфизм в DW 2.0

#dataweave #mule4

Вопрос:

Недавно мне стало известно о нотации, подобной дженерикам, для обозначения полиморфных типов в 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

ТИА!

Ответ №1:

Одним из наиболее распространенных применений parametric polymorphism в DataWeave является отражение в функциях системы типов, где тип возвращаемого значения зависит от его ввода.

Это полезно, чтобы избежать необходимости создавать специализированные функции для каждого возможного типа ввода, когда реализация будет одинаковой и они будут отличаться только своими сигнатурами.

Обратите внимание, что эта функция актуальна только во время проверки типа, эта информация не передается во время выполнения.

В вашем примере:

  • id1 будет выводить как тип a из использования id1 функции, так и тип возвращаемого значения, поскольку они не были указаны.
  • id2 сделает вывод, что тип возвращаемого значения имеет тип Any
  • id3 и id4 то же самое, тип возврата и a будет зависеть от того, с помощью чего вы вызываете функцию.

Чтобы проиллюстрировать разницу между Any и T вы могли бы попробовать:

 // var fails: String = id2("foo")
var ok: String = id3("foo")
 

Так как результат id2 не может быть назначен a String , так как он Any есть, но id3 возвращает a String , потому что ему было дано a String в качестве входных данных.