Scala:特征中的“静态值”?

2024-01-16

假设我有:

trait X {
  val x: String
}

使用混合,我可以定义一个特征,例如

trait XPrinter {
  self: X =>
  def printX: String = "X is: " + x
}

这样一个值/对象实现XPrinter实施x并给出其方法,例如printX访问指定的值X例如x.

到目前为止,一切都很好。

我想知道是否有一种方法可以具有以下形式的特征:

trait XDependent[T <: X] {
  def printX: String = ???
}

So that XDependent实例可以访问以下值T.x, with x假定为与类型定义粘合的“静态值”。

现在我明白为什么T.x无法访问XDependent因为类型子类型 X 甚至不必实现xT.x 可能是抽象的。

据我了解,虽然 Scala 提供了路径依赖类型,因此 X 中定义的抽象类型可以用于XDependent,如下所示:

trait X {
  type Y //which can be constrained as desired.
}

trait XDependent[T <: X]{
  def foo(v:T#Y)
  def bar: T#Y
}

它不提供与值相同的东西,因为 Scala 中类型和值之间有明显的分离。

现在我想到了值依赖类型 and 基于文字的类型。我想知道“类型的静态值”的想法(如上所示)是否与这些概念有很多重叠以及它们之间的联系。

我还想了解不同语言中采用的不同方法,以模糊类型和值之间的分离,它们与 Scala 类型系统的兼容性如何,以及将“静态值”与类型集成方面的复杂性-系统。即,(它们可以)/(如果它们是的话会发生什么)被子类型覆盖,等等。


如果可以放宽要求XDependent必须是一个trait,并使其成为abstract class相反,看起来好像一个类型类提供了一个空元方法x正是你想要的:

这是你的基本特征X(没有X.x或任何东西,这不会是“静态的”):

trait X

现在您可以定义一个类型类HasStaticX[T]这保证了对于一个类型T我们可以给一些字符串x:

trait HasStaticX[T] {
  def x: String
}

然后你可以像这样使用它:

abstract class XDependent[T <: X : HasStaticX] {
  def printX: String = implicitly[HasStaticX[T]].x
}

What HasStaticX本质上是构建一个可以接受类型的编译时部分函数T并产生一个字符串值x有关联T。因此,在某种程度上,它类似于一个接受类型并返回值的函数。如果这是你想要的,那么“集成静态值”不需要做任何事情,它只适用于当前非实验性的主流 Scala 版本。

“值依赖类型”正好相反:这些本质上是为值分配类型的“函数”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:特征中的“静态值”? 的相关文章

随机推荐

  • 尝试获取字段值时出现属性错误

    我正在使用 django 休息框架 并且我尝试使用的序列化器正在创建错误 我正在尝试做类似的事情https gist github com anonymous 7463dce5b0bfcf9b6767 https gist github c
  • 在不耗尽 RAM 的情况下使用并发 Future

    我正在做一些文件解析 这是一个 CPU 密集型任务 无论我向该进程放入多少文件 它使用的 RAM 都不会超过 50MB 该任务是可并行的 我已将其设置为使用下面的并发 future 将每个文件解析为单独的进程 from concurrent
  • 在Java中写入文本文件而不覆盖

    我正在尝试编写一种方法 如果 log txt 文件 尚不存在 则创建一个 log txt 文件 然后写入该文件 我遇到的问题是每次调用该方法时 它都会覆盖现有日志 如何更改方法 以便不覆盖数据而只更新文件 我的写入文件方法 File log
  • DataTable - 使可滚动,设置背景颜色并修复/冻结标题行和第一列

    我开始在 Flutter 中使用 webview 图表 表格进行开发 但是我遇到了一些表格问题 I use 数据表来表示表中的数据 有第一个问题 默认情况下 如果数据超出屏幕 则它不可滚动 所以我嵌入了一些小部件 即 SingleChild
  • 如何输入提示

    我如何输入提示来摆脱剩余的反射调用 def B amap D A i D B amap doubles aget A int i j doubles row 2 aget row int j 还剩下两个反射调用 但我不知道如何摆脱它们 您没
  • 使用 Alpha 通道绘制重叠的圆圈

    这个问题已经在这里得到了回答 重叠圆的组合面积 https stackoverflow com questions 1667310 combined area of overlapping circles 不过我的问题更具体 我在其他任意大
  • 不同格式的 SQL Server 日期时间比较

    我有一个 SQL 查询 我将在其中传递dd mm yyyy但SQL查询需要mm dd yyyy 我怎样才能启用此查询dd mm yyyy并根据正确的格式显示正确的结果 在 SQL Server 2008 中实现这一目标的最佳方法是什么 SE
  • realurl 生成没有 cHash 的条目

    我有一个 piBase 扩展 其中包含记录列表和详细信息页面 当首先调用列表时 一切都很好 realurl 版本2 0 15 TYPO3版本7 6 10 使用cHash参数创建详细信息页面的url 例如 cHash dc3409cee49f
  • Bootstrap 4.0 - 带图像+导航栏+全高正文的响应式标题

    我正在使用 bootstrap 4 构建一个响应式页面 其中有一个标题 标题部分 其中包含客户徽标 名称和导航栏的图像 所有这些元素都是响应式的 即图像根据屏幕尺寸缩小 导航栏在小屏幕上最小化 现在我想让身体也能做出反应 即 用内容填充屏幕
  • 多表触发器 SQL Server noob

    我有很多表都具有相同的 2 个日期时间列 lastModDate dateAdded 我想知道是否可以为这些表设置全局插入更新触发器来设置日期时间值 或者如果没有 有哪些方法 非常感谢任何指点 我同意没有这样的全局触发器 但是我们当然可以通
  • 如何将约束名称添加到已存在的约束中

    有没有办法为已经存在的约束命名 例如 create table employee emp id number 10 emp name varchar2 20 dept id number 10 foreign key dept id ref
  • Rails attr_accessible rspec 检查

    当我想测试属性是否为 不是时无障碍使用 RSpec 我这样做 class Foo attr accesible something else end describe Foo do it author should not be acces
  • 读取顺序文件 - 压缩文件与未压缩文件

    我正在寻找从磁盘读取顺序文件的最快方法 我在一些帖子中读到 如果我使用 lz4 等压缩文件 我可以获得比读取平面文件更好的性能 因为我将最大限度地减少 i o 操作 但是当我尝试这种方法时 扫描 lz4 压缩文件的性能比扫描平面文件差 我没
  • 将组合器解析器的列表/序列转换为单个解析器

    我有一个值列表 可以从中构造一个解析器列表 这些解析器通过映射依赖于这些值 请参见示例 然后我想做的就是通过串联将解析器列表变成单个解析器 一种可能性是使用foldLeft and parsers foldLeft success Nil
  • UISlider的editingDidEnd事件在iPad上不起作用

    我想在滑动 UISlider 结束时触发一种方法 我在 xib 中使用了 UISlider 的 editingDidEnd 事件并将其附加到 IBAction 方法 但该方法没有被调用 任何人都可以帮助我如何知道滑动何时结束UISlider
  • Visual Studio 2015 更新 3 (KB3165756) 安装程序被阻止

    因此 我尝试在新的 Windows 10 笔记本电脑上安装 Visual Studio 2015 Update 3 但无法安装以挽救我的生命 当我尝试通过原始安装 ISO 安装它时 它一直告诉我软件包失败 如果我使用独立更新文件 它会告诉我
  • 在首选项行中添加按钮

    我想要在 设置 屏幕上有一个按钮 这个问题已经被问过here https stackoverflow com questions 10514005 add a button into prefrencescreen android 但遗憾的
  • 如何让全局变量可以跨所有包访问

    我有一个 main go 文件 其中包含 running the router in port 9000 func main router Global routers InitApp fmt println Global router R
  • 每个字母表的排列最多 29 个字符?

    我正在尝试编写一个程序 该程序将生成一个文本文件 其中包含从一个字符到二十九个字符的每种可能的字母表排列 我选择了29作为大家都知道的最长的英文单词 它是antidistitutionalarianism 长度为28个字符 还有一些较长的
  • Scala:特征中的“静态值”?

    假设我有 trait X val x String 使用混合 我可以定义一个特征 例如 trait XPrinter self X gt def printX String X is x 这样一个值 对象实现XPrinter实施x并给出其方