gpt4 book ai didi

scala - 在编译时强制scala varargs的非空性

转载 作者:行者123 更新时间:2023-12-04 16:58:34 25 4
gpt4 key购买 nike

我有一个函数需要可变数量的相同类型的参数,这听起来像 varargs 的教科书用例:

def myFunc[A](as: A*) = ???

我遇到的问题是 myFunc不能接受空参数列表。有一种在运行时强制执行的简单方法:
def myFunc[A](as: A*) = {
require(as.nonEmpty)
???
}

问题在于它发生在运行时,而不是编译时。我希望编译器拒绝 myFunc() .

一种可能的解决方案是:
def myFunc[A](head: A, tail: A*) = ???

这在 myFunc 时有效使用内联参数调用,但我希望我的库的用户能够传入 List[A] ,这种语法很尴尬。

我可以尝试两者兼得:
def myFunc[A](head: A, tail: A*) = myFunc(head +: tail)
def myFunc[A](as: A*) = ???

但我们又回到了起点:现在有一种方法可以调用 myFunc带有一个空的参数列表。

我知道 scalaz 的 NonEmptyList ,但尽可能多地使用 STLib 类型。

有没有办法只使用标准库来实现我的想法,或者我是否需要接受一些运行时错误处理来处理真正感觉编译器应该能够处理的事情?

最佳答案

这样的事情呢?

scala> :paste
// Entering paste mode (ctrl-D to finish)

def myFunc()(implicit ev: Nothing) = ???
def myFunc[A](as: A*) = println(as)

// Exiting paste mode, now interpreting.

myFunc: ()(implicit ev: Nothing)Nothing <and> [A](as: A*)Unit
myFunc: ()(implicit ev: Nothing)Nothing <and> [A](as: A*)Unit

scala> myFunc(3)
WrappedArray(3)

scala> myFunc(List(3): _*)
List(3)

scala> myFunc()
<console>:13: error: could not find implicit value for parameter ev: Nothing
myFunc()
^

scala>

用具有适当 implicitNotFound 的类替换 Nothing注释应该允许一个合理的错误信息。

关于scala - 在编译时强制scala varargs的非空性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40094780/

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