隐含的类型同义词?

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 = ... 版本长了整整一个字符。