函数类型可以通过推理来定义吗?

2024-03-30

Scala 类型推断非常好,而且很容易习惯,不必写两次。当你不得不这么做的时候,你会更痛苦。函数类型就是这样的一个例子。

有时我想为某些函数签名创建命名类型。有可能吗?有什么方法可以获取函数的编译时类型,这样我在定义时就不必再次输入它FType?

object Foo {
  def f(a:Int, b:Int, x:Double, y:Double, name:String) : Unit = {}

  //type FType = typeOf(f) // can compiler provide me a compile time type somehow?
  type FType = (Int,Int,Double,Double,String) => Unit

  def callF( func:FType) = func(0,0,0,0,"")
}

有没有类似C++的东西decltype http://en.wikipedia.org/wiki/DecltypeScala 中哪个可以用于此目的?


我不太确定你想在这里实现什么,如果我理解正确的话你想避免打字(a:Int, b:Int, x:Double, y:Double, name:String)两次。

定义怎么样FType你自己预先,然后简单地重用它f and callF?

object Foo {
  type FType = (Int,Int,Double,Double,String) => Unit

  def f: FType = (a, b, x, y, name) => ()

  def callF(func: FType) = func(0,0,0,0,"")
}

如果你真的想抽象FType,这是一个明显不同的问题,但情况似乎并非如此,因为您通过调用来强制类型func(0,0,0,0,"").

你没有decltype在 Scala 中,因为类型不像在 Idris 中那样不是一等公民。也就是说,你应该能够使用它来编写它无形的 https://github.com/milessabin/shapeless和/或宏。

如果您想修复类型和参数并重用它们,最简单的解决方案是将它们变成case class。然后你可以使用import直接访问您的字段:

object Foo {
  case class FArgs(a: Int, b: Int, x: Double, y: Double, name: String)

  def f(args: FArgs): Unit = {
    import args._
    println(name) // or whatever you want to do
  }

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

函数类型可以通过推理来定义吗? 的相关文章

随机推荐

  • 将遵循方向的点集分组在一起的算法

    注意 我将这个问题放在 MATLAB 和 Python 标签中 因为我最精通这些语言 但是 我欢迎任何语言的解决方案 问题序言 我用鱼眼镜头拍摄了一张图像 该图像由带有一堆方形物体的图案组成 我想要对该图像执行的操作是检测每个正方形的质心
  • Android Activity 出现泄漏窗口

    我想做的是从服务器获取文件 相同的代码正在使用 sdcard 运行 f9 但是当我从整个线程获取文件时 我在 logcat 中收到以下错误 我的代码如下 public class Map extends Activity private G
  • 将 SQL 文件导入到 Rails 4 ActiveRecord 数据库?

    我在这里查看了其他几个问题 它们有点相似 但不完全是我想要的 我想做的是导入 转换 一个 sql 文件 其中包含 8 个表 每个表包含大约 24 列 这个文件实际上是相当扁平的文件 看起来好像之前工作的唯一查询必须与表之间关联共享的 id
  • 角度观察者和事件侦听器以什么顺序执行?

    如果先更改作用域属性 然后再广播事件 那么相应的观察者回调和事件侦听器回调是否总是以相同的顺序执行 例如 scope foo 3 scope broadcast bar 和其他地方 scope watch foo function fn1
  • 使用 Typescript 请求 DeviceMotionEvent 权限

    实现陀螺仪权限请求 但我在 requestPermission 上收到打字稿错误 My code if typeof DeviceMotionEvent undefined typeof DeviceMotionEvent requestP
  • 如何在排除一种可能性的情况下随机选择列表中的一项?

    除了列表中的给定项目之外 从列表中随机选择项目的最简单方法是什么 例子 list 2 4 5 7 9 34 54 如何随机选择除 7 之外的任何数字 可能有两种主要策略 从列表中删除异常 并从中采样 import random def ch
  • 使用指向基类的指针访问受保护的继承成员

    有人可以解释为什么这段代码不起作用 class A public A void virtual A void protected A parent class B public A public B void parent new B B
  • 如何将 boost::any 打印到流?

    我有一张地图std map
  • 自动选择按钮(如何关闭此功能?)

    我有 winform 按钮 当您加载表单时 会选择某个按钮 我所说的选择的意思是 如果按下 输入 则按下该按钮 我怎样才能改变我的按钮 让他们不再这样做 Tab 键顺序按照您在表单上添加控件的顺序设置 如果您的第一个可以按下 选择 编辑的控
  • 如何将字符串绘制到图像中?

    我正在尝试使用 image picker 库从相机获取图片 然后我想添加图片拍摄日期和时间的信息 那可能吗 谢谢 您可以使用将字符串绘制到图像中图2 1 12 https pub dev packages image 您必须在 dart 文
  • 在Webstorm中删除右侧的一个字符

    我忘记了这个按键绑定 和emacs是一样的Ctrl D我尝试过谷歌搜索 删除右侧一个字符 向前删除 删除下一个字符 等内容 这里有phpstorm 中的绑定 https www jetbrains com phpstorm webhelp
  • 如何访问 Ruby 中的基本命名空间?

    我正在文件模块存在的命名空间中编写代码 在另一个模块内 我需要访问 ruby File 类 在 php 中可以这样完成 File 如何在红宝石中做到这一点 File 前缀为 访问命名空间树的 根
  • 为什么 Javascript 不包含保留关键字,例如“Object”、“Array”、“Function”、“Number”...?

    一些特殊的词 例如Object Array Function Method Numberetc 不属于 Javascript 中的关键字 JavaScript 中的保留关键字 https stackoverflow com question
  • AWS IAM 策略允许用户创建具有特定策略/角色的 IAM 用户

    我想创建一个策略 允许创建具有有限权限或与创建它们的用户相同权限的 IAM 用户 基本上 我想允许一个用户创建另一个用户 但也想准确指定一个用户可以向另一个用户提供哪些策略 例如 我创建一个新用户 用户A 用户 A 仅有权创建具有 同样 有
  • 在上传到远程网站期间缩小/调整视频大小

    我有一个用 Ruby on Rails 编写的 Web 应用程序 它使用表单将视频从用户上传到服务器 我实际上使用直接上传到 s3 的 jquery 上传器 但我认为这不相关 为了减少视频的上传时间 我想缩小它的大小 例如如果视频大小为 1
  • 如何在aspell字典中使用Unicode?

    我正在尝试使用aspell检查我的文本中的拼写 我有一本自定义词典 但有例外 它们都是 ASCII 格式的 但有一个单词是 Unicode 格式的 foo en pws personal ws 1 1 en 554 Foo bar B rb
  • MySQL 拆分和连接值

    我有一个表 mapping 有 2 列 类似于下面 id values 1 1 2 2 1 2 3 3 1 1 4 1 1 2 另一个表 map 与此类似 sno values 1 Test 2 Hello 3 Hai 我的预期输出是 id
  • 如何更改SQL Server中主键的列长度?

    我知道如何更改列的长度 但我的 SQL 语句失败 因为我尝试更改的列是 PK 因此出现以下错误 消息 5074 16 级 状态 1 第 1 行对象 PK TableName 依赖于列 PersonID 人物ID PK 我读了更改sql se
  • 使用 PHP 从 Excel 文件 (xlsx) 中提取图像

    如何使用PHPExcel从excel文件中读取图像并将图像保存在服务器中并显示它们 该文件的扩展名是 xlsx My code objPHPExcel PHPExcel IOFactory load path foreach objPHPE
  • 函数类型可以通过推理来定义吗?

    Scala 类型推断非常好 而且很容易习惯 不必写两次 当你不得不这么做的时候 你会更痛苦 函数类型就是这样的一个例子 有时我想为某些函数签名创建命名类型 有可能吗 有什么方法可以获取函数的编译时类型 这样我在定义时就不必再次输入它FTyp