gpt4 book ai didi

scala - scalaz 中定义的 @@ 运算符是什么?

转载 作者:行者123 更新时间:2023-12-03 15:46:09 24 4
gpt4 key购买 nike

浏览 piece of Scala code at aws-scala by Atlassian 时您可以找到以下行:

type QueueURL = String @@ QueueURL.Marker

我是 Scala 新手,所以我可能错了,但是 @@ (double at-sign) 看起来不像标准的内置 Scala 运算符。此外,细心的读者会发现它是从“scalaz”库导入的:
import scalaz.{ Tag, @@ }
@@ 是什么意思做?为什么要使用它?

正如评论中提到的, actual definition is :
 type @@[A, T] = A

这可能是一些提示。

最佳答案

标签的想法是你经常不想使用原始 Long年代,Int s 等等 - 好吧,你想在你的代码中使用它们,但你不想在接口(interface)级别传递它们:

def fetchUsers(numberOfUsers: Int, offset: Int): Seq[User]
在这里,您必须使用命名参数以确保您没有交换参数的顺序。此外,有人可能会错误地用错误的顺序覆盖它:
override def fetchUsers(offset: Int, numberOfUsers: Int): Seq[User]
为避免这种情况,您可以对两个参数使用不同的类型。一种方法是使用带有 AnyVal 的案例类。 - 如果你遵循一些规则,它会被编译器优化为原语。标签是为一些常见类型(可能不一定是原语)引入新类型的替代方法。 @@定义为
type @@[A, T] = A
正如你所注意到的。因此,您可以将新类型定义为:
@@[String, QueueURL.Marker]
但是因为 Scala 允许我们在类型上使用中缀语法,所以我们也可以这样写:
String @@ QueueURL.Marker
如果您使用例如进行依赖注入(inject),这将特别有用。 implicits 或 Macwire - 参数仅基于类型获取,因此必须为每个可注入(inject)值具有区分类型(在旁注中,Macwire 实现了它自己的 @@ 版本 - 他们的做法略有不同,但达到同样的目的)。
然后你可以得到这样的代码:
def fetchUsers(numberOfUsers: Int @@ UsersNumber, offset: Int @@ Offset): Seq[User]
或者:
type UsersNumber = Int @@ UsersNumberTag
type UsersOffset = Int @@ UsersOffsetTag

def fetchUsers(numberOfUsers: UsersNumber, offset: UsersOffset): Seq[User]
我也看到了这个变种:
type UsersNumber[T] = T @@ UsersNumberTag
type UsersOffset[T] = T @@ UsersOffsetTag

def fetchUsers(numberOfUsers: UsersNumber[Int], offset: UsersOffset[Int]): Seq[User]
查看 aws-scala 代码,我假设他们想要实现第一个属性 - 能够区分某些常见类型的不同用法(如 String )并使用编译器检查他们是否犯了错误。
菊石示例:
@ type @@[A, T] = A with T
defined type @@

@ trait Username
defined trait Username

@ def passUsername(username: String @@ Username): Unit = ()
defined function passUsername

@ passUsername("test")
cmd3.sc:1: type mismatch;
String|String with Username
val res3 = passUsername("test")
^
Compilation Failed

关于scala - scalaz 中定义的 @@ 运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42396382/

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