隐含的类型同义词?
Type synonyms for implicits?
你能为采用隐式参数的函数创建类型同义词吗?
缩短
def findOnlyOne(f: Node => Boolean)(n: Node)(implicit errorType: String => ValidationError): Either[ValidationError, Node] = ...
如果 errorType 不是隐式的,则可能是这样的:
type ValidationF = (Node => Boolean) => Node => (String => U) => Either[U, Node]
findOnlyOne: ValidationF = f => n => onErr => ...
我猜你不能,因为与其他类型不同,隐式参数的名称对它很重要,所以你需要更高阶的东西,比如
ImplicitFunction[myImplicitParam, T]
对于implicit myImplicitParam: T
很难 google 因为 "type"、"implicit"、"synonym" 的组合没有传达我正在寻找一个包含隐式的类型同义词输入...
我认为SAM或多或少已经提供了你想要的:
trait Node
trait ValidationError
import scala.util.Either
abstract class ValidationF {
// single abstract method without implicits
def apply_impl(
f: Node => Boolean,
n: Node,
errorType: String => ValidationError
): Either[ValidationError, Node]
// actual `apply` with implicits
def apply
(f: Node => Boolean)
(n: Node)
(implicit errorType: String => ValidationError)
: Either[ValidationError, Node] = {
apply_impl(f, n, errorType)
}
}
val findOnlyOne: ValidationF =
(f, n, onErr) => (??? : Either[ValidationError, Node])
它只适用于元组参数,不适用于长链的柯里化函数,但是...
如果你坚持用柯里化函数初始化这些东西,那么你可以为此创建一个单独的工厂方法:
object ValidationF {
def apply(
curried:
(Node => Boolean) =>
Node =>
(String => ValidationError) =>
Either[ValidationError, Node]
): ValidationF = new ValidationF {
def apply_impl(
f: Node => Boolean,
n: Node,
errorType: String => ValidationError
): Either[ValidationError, Node] = {
curried(f)(n)(errorType)
}
}
}
val findOnlyTwo = ValidationF(f => n => onErr =>
(??? : Either[ValidationError, Node])
)
它比 : ValidationF = ...
版本长了整整一个字符。
你能为采用隐式参数的函数创建类型同义词吗?
缩短
def findOnlyOne(f: Node => Boolean)(n: Node)(implicit errorType: String => ValidationError): Either[ValidationError, Node] = ...
如果 errorType 不是隐式的,则可能是这样的:
type ValidationF = (Node => Boolean) => Node => (String => U) => Either[U, Node]
findOnlyOne: ValidationF = f => n => onErr => ...
我猜你不能,因为与其他类型不同,隐式参数的名称对它很重要,所以你需要更高阶的东西,比如
ImplicitFunction[myImplicitParam, T]
对于implicit myImplicitParam: T
很难 google 因为 "type"、"implicit"、"synonym" 的组合没有传达我正在寻找一个包含隐式的类型同义词输入...
我认为SAM或多或少已经提供了你想要的:
trait Node
trait ValidationError
import scala.util.Either
abstract class ValidationF {
// single abstract method without implicits
def apply_impl(
f: Node => Boolean,
n: Node,
errorType: String => ValidationError
): Either[ValidationError, Node]
// actual `apply` with implicits
def apply
(f: Node => Boolean)
(n: Node)
(implicit errorType: String => ValidationError)
: Either[ValidationError, Node] = {
apply_impl(f, n, errorType)
}
}
val findOnlyOne: ValidationF =
(f, n, onErr) => (??? : Either[ValidationError, Node])
它只适用于元组参数,不适用于长链的柯里化函数,但是...
如果你坚持用柯里化函数初始化这些东西,那么你可以为此创建一个单独的工厂方法:
object ValidationF {
def apply(
curried:
(Node => Boolean) =>
Node =>
(String => ValidationError) =>
Either[ValidationError, Node]
): ValidationF = new ValidationF {
def apply_impl(
f: Node => Boolean,
n: Node,
errorType: String => ValidationError
): Either[ValidationError, Node] = {
curried(f)(n)(errorType)
}
}
}
val findOnlyTwo = ValidationF(f => n => onErr =>
(??? : Either[ValidationError, Node])
)
它比 : ValidationF = ...
版本长了整整一个字符。