【问题标题】:Sample of `forSome { val `?`forSome { val `的示例?
【发布时间】:2020-04-05 18:58:49
【问题描述】:

Scala 语言规范将Existential Types 的语法指定为

Type               ::= InfixType ExistentialClauses
ExistentialClauses ::= ‘forSome’ ‘{’ ExistentialDcl
                       {semi ExistentialDcl} ‘}’
ExistentialDcl     ::= ‘type’ TypeDcl
                    |  ‘val’ ValDcl

我见过很多代码同时使用forSometype,例如

List[T] forSome { type T; }

但我从来没有见过forSomeval,有样品吗?

【问题讨论】:

标签: scala existential-type path-dependent-type


【解决方案1】:

如果你仔细想想,你很快就会意识到类型中出现的唯一时间值是与路径相关的类型。举例:

trait Trait {
  val x: { type T }
  val y: x.T // path dependent type: here comes our val
}

将其应用于存在类型,我们现在可以轻松地制作一个forSome { val的样本

type SomeList = List[v.T] forSome { val v : { type T }; }

上述类型表示其元素属于路径相关类型v.T的任何列表。

举例:

object X { 
  type T = String
  val x: T = "hello" 
}
val l1: SomeList = List(X.x) // compiles fine
val l2: SomeList = List(123) // does not compile

诚然,SomeList 是毫无用处的。通常,这种存在类型只有作为更大类型的一部分才会真正有用。

【讨论】:

  • 谢谢,但很抱歉,我还是听不懂。为什么X.x 符合v.T forSome { val v : { type T }; }X.x 有成员 type T 吗?但是从type T = String; val x:T="hello",我看不到x{type T}
  • 不是X.x成员type T,而是类型T。这里Xobject 或换句话说,一个值)对应于我们类型相关类型中的v。此外,X.x 的类型为 X.T。所以很明显X.x 满足v.T 类型,因为X 绝对是一些 值。
  • 自我更正:我的意思是“路径依赖类型”而不是“类型依赖类型”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2016-11-05
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多