Scala: проблемы с использованием функций в качестве объектов первого класса - PullRequest
5 голосов
/ 31 июля 2010

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

List[(Any)=>Unit]

но как только я пытаюсь вставить функцию, например

String=>Unit

Я получаю ошибку. Как я могу объявить набор универсальных функций, который не учитывает типы параметров и возвращаемых значений?

Ответы [ 2 ]

11 голосов
/ 31 июля 2010

Функции контравариантны в параметрах типа intput, например, в вашем случае Function1[-T1,+R]. Это означает, что вы можете добавить экземпляр Any => Unit к List[String => Unit], но не наоборот. Это, конечно, имеет смысл, поскольку вы не можете вызвать функцию, ожидающую аргумент типа String с аргументом типа Any.

9 голосов
/ 31 июля 2010

Чтобы завершить ответ @Moritz, вам нужно выбрать аргумент типа для T1, который является подтипом типа ввода каждой функции в списке. Nothing соответствует требованиям - это подтип любого типа.

scala> val l: List[Nothing => Any] = List((b: String) => b, (a: Int) => a)
l: List[(Nothing) => Any] = List(<function1>, <function1>)

Экзистенциальный тип также работает:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)        
l: List[Function1[_, _]] = List(<function1>, <function1>)
...