gpt4 book ai didi

scala - 具有泛型类型的默认函数参数

转载 作者:行者123 更新时间:2023-12-02 07:21:05 24 4
gpt4 key购买 nike

我的函数获取另一个函数(将输入类型映射到输出类型)作为参数:

type Handled[S,R] = S => R

def myFunc[S,R](value: S, handled: Handled[S,R] = defaultHandled): R = {
handled(value)
}

我需要编写 defaultHandled 函数,它将获取输入类型并按原样返回。

所以默认情况下我想将输入类型映射到输出类型,其中输入类型与输出类型相同。对于任何输入类型,此函数应该简单地将输入传递到输出。怎么做?

最佳答案

虽然从技术上讲这是可能的:

type Handled[S, R] = S => R

def defaultHandled[S, R](x: S): R = x.asInstanceOf[R]

def myFunc[S, R](value: S, handled: Handled[S, R] = defaultHandled[S, R] _): R = {
handled(value)
}

myFunc[Int, Int](1)

它不是类型安全的,通常不是一个好主意。例如,如果您尝试使用不同类型的参数调用 myFunc,同时仍然依赖于默认的 handled 值,您将得到运行时异常:

myFunc[Int, String](1)

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Scala 解决这个问题的方法是将其作为隐式参数处理。在这种情况下,您可以提供编译器可能会使用的默认实现。

type Handled[S, R] = S => R

implicit def defaultHandled[S]: Handled[S, S] = identity

def myFunc[S, R](value: S)(implicit handled: Handled[S, R]): R = {
handled(value)
}

myFunc(1) // compiles and works

myFunc[Int, String](1) // compilation error: Error:(11, 21) No implicit view
// available from Int => String.
//myFunc[Int, String](1)
// ^

关于scala - 具有泛型类型的默认函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46137719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com