Получить аргументы FunctionX и типы вывода

Я изо всех сил пытаюсь получить типы аргументов определенной функции в Scala. Например Funcion1[T1, T2].

Поскольку Java устранит проверку типов (предупреждение компилятора: is unchecked since it is eliminated by erasure), я хотел бы найти способ match этой функции с их типами.

Цель состоит в том, чтобы иметь возможность иметь ту же функциональность, что и:

val fnInput = {x: Map[String, Double] => x}

fnInput match {
    case f: Function1[Map[String, Double], Map[String, Double]] => ???
    case f: Function1[T1, T2] => ???
    case f: Function2[T1, T2, T3] => ???
}

Но, проверяя типы аргументов.

Обновлено: на данный момент мое решение будет заключаться в использовании следующих инструментов.

import scala.reflect.runtime.universe._
def getType[T: TypeTag](obj: T) = typeOf[T]
val t = getType({x: Map[String, Any] => x})
// check first argument
typeOf[Map[String, Int]] <:< t.typeArgs(0)

// check return of Function1
typeOf[Map[String, Int]] <:< t.typeArgs(1)

// t.typeArgs.length will return the number of arguments +1

Вы считаете, что это хороший подход?


person aitorhh    schedule 20.09.2018    source источник
comment
Вы уверены, что не можете избежать случая, когда такая расплывчатая вещь определяется как ввод? Вы буквально говорите, что я ожидаю какую-то функцию от чего-то к чему-то с некоторым количеством параметров, которые могут иметь или не иметь разные типы. Я считаю, что это очень далеко от любого представления о чистом и элегантном коде FP. Но если это неизбежно, вам придется прибегнуть к TypeTags или чему-то подобному (см. здесь например).   -  person slouc    schedule 20.09.2018
comment
На самом деле у меня довольно часто возникает этот вопрос... Это не кажется правильным подходом. Что я избегаю объяснять в вопросе, так это то, что функция fnInput на самом деле исходит из строки. Строка компилируется во время выполнения (с использованием панели инструментов), затем я хотел бы проверить типы функций, чтобы перенаправить их в базовый код.   -  person aitorhh    schedule 20.09.2018