gpt4 book ai didi

Scala 和::对象

转载 作者:行者123 更新时间:2023-12-04 13:00:53 24 4
gpt4 key购买 nike

我一直在潜入 scala,到目前为止我非常喜欢它。我正在研究模式匹配和案例类,以下让我有些难过。我知道它的作用,但我想确切地了解正在发生的事情

var list = List(2,3,4)
1::list

如果我到目前为止的理解是正确的。然后::代表一个案例对象。如果是这样,我的问题是:

我如何将其“左应用​​”到 1?而不是::是 1 的方法。基本上有人可以将这个语句 1::list 分开一些,显示真正发生的事情(即在什么对象上调用什么方法)

谢谢

最佳答案

令人讨厌的是,Scala 的一些最明显和最令人敬畏的特性在表面之下却有着如此多的复杂性。所以,考虑这个简单的行:

val (head :: tail): ::[Int] = 1 :: Nil
:: 的三个地方中的每一个出现指的是不同的 :: ,以及 Scala 中的不同机制。让我们按顺序逐一介绍。
head :: tail
这里发生的是模式匹配,就像我们看到的 case陈述。模式匹配可以出现在 val作业,在 <- 的左侧在 for理解,然后在 case陈述。

那么,这种特定的模式匹配是如何发生的呢?好吧,只要模式的格式为 a b c , Scala 将其翻译成 b(a, c) , 然后转换为对 unapply 的调用或 unapplySeq在对象 b .

所以, ::val (head :: tail)指对象 :: (通过 case class 定义)。
: ::[Int]
这是一个类型声明,所以 ::[Int]是一种类型。 ::它本身是一个类,也是一个类型构造函数(因为它在给定类型参数的情况下构造类型—— ::[Int] 是一种类型, ::[String] 是另一种类型,等等)。它也是 List 的子类,它只有两个子类: ::Nil 的单例类.

这个声明是多余的,一般来说,很少有人使用 ::作为类型或类。我在这里展示它主要是为了完整性。
1 :: Nil
在这里, ::是一种方法。这是 List的方法,所以,因为 NilList1不是,一定属于 Nil (或通过隐式转换可用)。

这里需要注意的机制是方法以 : 结尾。 , 在中缀运算符表示法中使用时,绑定(bind)到右侧而不是左侧。或者,换句话说, a :: b相当于 b.::(a) .

这种机制很少使用,我怀疑主要是为了让习惯于 fp 的程序员更熟悉传统的 fp 列表算法。它在 Scala 标准库和其他一些地方使用。

例如,在 Scala 2.8 上,现在有 +: ,其目的与 :: 相同, 但为所有 Seq 定义.它被 :+ 镜像,它附加元素,其 :除了消除它与 + 的歧义之外,没有其他用途。 ,它被重载以连接字符串。

关于Scala 和::对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5311653/

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