Полиморфизм в DW 2.0 - PullRequest
       73

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

2 голосов
/ 03 августа 2020

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

ПРИМЕЧАНИЕ: Я действительно использовал application/dw, чтобы увидеть символы функций при запуске предварительного просмотра из Anypoint Studio

TIA!

1 Ответ

6 голосов
/ 03 августа 2020

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

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

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

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

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

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

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

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

...