ли это как-то можно объявить что-то вродеобъявляем функцию `` type` с implicit` параметрами
type F = (Int, Boolean)(implicit String) => Unit
в Scala?
ли это как-то можно объявить что-то вродеобъявляем функцию `` type` с implicit` параметрами
type F = (Int, Boolean)(implicit String) => Unit
в Scala?
Существует очень важное различие в Scala между «функцией» и «метод»:
Функция значение, и не может принимать аргументы по имени, не может быть полиморфными, не может быть VARIADIC , не могут быть перегружены и не могут иметь неявные параметры. Хотя методы могут иметь их, они не могут передаваться как значения.
типов функций просто черты в стандартной библиотеке, в следующей форме:
trait FunctionN[T1, ..., TN, R] {
def apply(x1: T1, ..., xN: TN): R
}
Обратите внимание, как метод apply
в этих типах делают не имеет неявный список параметров. Поэтому функции никогда не будут иметь неявных параметров.
Так что, если вы хотите передать «функцию», которые принимают неявные параметры, вы должны создать свой собственный признак:
trait Function2I1[T1, T2, I1, R] {
def apply(a1: T1, a2: T2)(implicit i1: I1): R
}
type F = Function2I1[Int, Boolean, String, Unit]
Теперь вы можете создавать экземпляры типа F
(хотя и не с блестящим синтаксисом лямбды):
val f = new F {
override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ???
}
implicit val x = "hi"
f(1, true) // implicitly passes x
Если вы хотите кэрри функции без скрытых параметров, просто написать (Int, Boolean) => String => Unit
.
Если вы хотите, чтобы преобразовать способ функции, использовать лямбда:
class A {
def f(a: String)(implicit b: String): String = a + b
}
val a = new A
val m = a.f(_) // takes the implicit in this scope
К сожалению, я удалил свой комментарий, это «вы можете сделать тип F = (Int, Boolean) => (String) => Единица в любом случае ". Вы правы, говоря, что это не работает с implicits, я думаю, это потому, что вы не должны зависеть от них в своих типах. Функция, которая принимает Int и Boolean, является функцией, которая принимает Int и Boolean независимо от имплицитов в области видимости. Редактирование: Ok, ven ответил ниже, метод не является функцией, а fuctions не имеет implicits –