Scala анонимный миксин? - PullRequest
0 голосов
/ 04 июля 2018

при отладке мне пришлось проверить файл scala.collection.GenSetLike . Я столкнулся с этим небольшим количеством кода в интерфейсе:

trait GenSetLike[A, +Repr] 
extends GenIterableLike[A, Repr]
  with (A => Boolean)
  with Equals
  with Parallelizable[A, parallel.ParSet[A]] {
  ...
}

Что означает (A => Boolean) микс? Я попытался выполнить поиск по различным ключевым словам, но не смог найти что-то удовлетворительное.
Этот синтаксис указывает на функцию, которая принимает A и возвращает логическое значение , но я не вижу смысла в контексте черты mixin ...

Мое первое предположение было связано с такими вещами, как конструктор или apply, но это всего лишь интуиция.

Пожалуйста, научите меня!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Set в Scala реализует интерфейс Function1[A, Boolean] (A => Boolean), переопределяющий apply, такой же, как contains, поэтому наборы в Scala могут использоваться как функции.

> val s = Set(1,2,3) 
s: Set[Int] = Set(1, 2, 3)

> s(2) 
res1: Boolean = true

> s.apply(3) 
res2: Boolean = true

> s(23) 
res3: Boolean = false

Это, кстати, причина, по которой Set инвариантен.

0 голосов
/ 04 июля 2018

A => Boolean - синтаксический сахар для Function1 признак

Scala REPL

scala> def f[A] = (a: A) => true
f: [A]=> A => Boolean

Вышеупомянутая лямбда также может быть записана как

scala> def f[A]: Function1[A, Boolean] = (a: A) => true
f: [A]=> A => Boolean
...