scala 贷款模式,可选函数参数

2024-06-21

我有一个贷款模式,该模式应用函数 n 次,其中“i”是递增变量。 “偶尔”,我希望传入的函数能够访问“i”......但我不想要求传入的所有函数都需要定义一个参数来接受“i”。下面的例子...

def withLoaner = (n:Int) => (op:(Int) => String) => {
  val result = for(i <- 1 to n) yield op(i)
  result.mkString("\n")
}

def bob = (x:Int) => "bob" // don't need access to i. is there a way use () => "bob" instead?
def nums = (x:Int) => x.toString // needs access to i, define i as an input param

println(withLoaner(3)(bob))

println(withLoaner(3)(nums))

def withLoaner(n: Int) = new {
  def apply(op: Int => String) : String = (1 to n).map(op).mkString("\n")
  def apply(op: () => String) : String = apply{i: Int => op()}
}

(不知道和贷款模式有什么关系)

Edit评论中要求的解释很少。

不确定你对 scala 知道什么、不知道什么,以及在代码中你不理解什么。很抱歉,如果我只是对显而易见的事情进行了阐述。

首先,scala 程序由特征/类(也是单例对象)和方法组成。所做的一切都是通过方法完成的(将构造函数放在一边)。函数(与方法相反)是各种 FunctionN 特征(N 是参数数量)的实例(子类型)。它们每个都有一个 apply 方法,它是实际的实现。 如果你写

val inc = {i: Int => i + 1}

它被脱糖为

val inc = new Function1[Int, Int] {def apply(i: Int) = i + 1}

(定义一个匿名类扩展Function1,使用给定的 apply 方法并创建一个实例)

所以写一个函数比写一个简单的方法更有分量。此外,您不能进行重载(多个具有相同名称的方法,其签名不同,正如我上面所做的那样),也不能使用命名参数或参数的默认值。

另一方面,函数是第一类值(它们可以作为参数传递,作为结果返回),而方法则不是。它们会在需要时自动转换为函数,但是这样做时可能会出现一些边缘情况。如果一个方法只是用作函数值,而不是作为方法调用,那么编写一个函数可能会更好。

一个功能f,以其apply方法,被调用为f(x)而不是f.apply(x)(这也有效),因为 scala 脱糖函数调用符号对值(值后跟括号和 0 个或多个参数)调用方法apply. f(x)是语法糖f.apply(x)。无论什么类型,这都有效f,它不必是其中之一FunctionN.

withLoaner 所做的是返回一个对象(匿名类型,但可以单独定义一个类并返回它的实例)。该对象有两个apply方法,一种接受Int => String,另一个是() => String。当你这样做时withLoaner(n)(f)它的意思是withLoaner(n).apply(f)。选择适当的应用方法,如果f具有其中之一的正确类型,否则编译错误。

以防万一你想知道withLoaner(n)并不意味着withLoaner.apply(n)(或者它永远不会停止,这也可能意味着withLoaner.apply.apply(n)),因为 withLoaner 是一个方法,而不是一个值。

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

scala 贷款模式,可选函数参数 的相关文章

随机推荐

  • d3:力向图:节点过滤

    我正在浏览以下帖子 突出显示选定的节点 https stackoverflow com questions 8739072 highlight selected node its links and its children in a d3
  • 无法运行 playn 示例项目 - 编译错误

    我尝试按照 playn 入门页面上的说明进行操作 但在运行第一个程序 java Showcase 时遇到了问题 右键单击并运行 Maven 测试时出现以下错误 另外 我在 Eclipse 的问题选项卡中遇到许多与 无法从 yyy 传输 xx
  • 在 Silverlight 4 中托管 Microsoft Office 应用程序?

    我知道 Silverlight 4 通过以下方式支持 COM 互操作AutomationFactory class dynamic excel AutomationFactory CreateObject Excel Application
  • 警告:无法对已卸载的组件执行 React 状态更新。在功能组件中

    我有一个功能组件 我可以从 localStorage 获取一个值 并使用该值在某个状态中设置一个值 localforage getItem
  • 使用哪个正则表达式将此字符串转换为数组?

    从 mysql 中的地理空间列我得到以下字符串值 我想将其转换为数组 最终目标是将其转换为 geoJSON POLYGON 4 885838 52 388063 4 891061 52 388381 4 890973 52 382909 该
  • css3动画硬闪烁(帧之间没有淡入淡出)

    尝试使用 css3 动画连续闪烁三个元素 我已经让它运行了 但是每一帧都有一个淡入淡出 我想将其删除 理想情况下 每个元素保持可见 1 秒 然后立即隐藏 我尝试将动画设置为帧0 and 99 for opacity 1 and 100 fo
  • 强参数和多维数组

    我在用着轨道 3 2 6 with 参数强 https github com rails strong parameters gem 所以 我有一个具有典型更新操作的控制器 PUT api resources id def update r
  • 如何使用 udev 规则识别断开连接的 USB 设备?

    我有两个使用 Xorg xinerama 功能的 LCD 每个 LCD 屏幕都有一个触摸屏 连接到各自的 USB 线 查看 var log messages 文件 我看到以下内容 kernel input Analog Resistive
  • 将 SSL 证书从 Azure 密钥保管库添加到现有 VM linux vm

    如何将 SSL 证书从 Azure Key Vault 添加到现有的 azure Linux VM 对于 Windows 我们使用以下命令 vaultId Get AzureRmKeyVault ResourceGroupName reso
  • WPF 单击鼠标即可展开 TreeView

    我有一个带有 HierarchicalDataTemplate 的 WPF TreeView 目前我必须双击一个项目才能展开 折叠它 我想将此行为更改为单击 而不丢失其他功能 所以它应该在点击时展开和折叠 推荐的方法是什么 Thanks 您
  • 如何通过代码确定Oracle数据类型的字符串值?

    I use DBMS SQL DESCRIBE COLUMNS过程来确定 SELECT 查询的结果集中的列使用什么数据类型 但不幸的是这样我只能得到Oracle数据类型的代码 record col type 1 8 12 等 所以我想知道
  • “+=”和“=+”有什么区别? [复制]

    这个问题在这里已经有答案了 我有一段简单的代码 可以打印出整数 1 10 i 0 while i lt 10 i 1 print i 然后 如果你只改变第 3 行的一个运算符 它会打印出无限数量的 1 整数 我明白为什么这样做 为什么运行第
  • 如何更新 Node.js?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我执行了以下操作来更新我的 npm npm update npm g 但我不知道如何更新
  • 如何将.txt文件转换为Hadoop的序列文件格式

    有效利用 Map Reduce 作业Hadoop http hadoop apache org 我需要将数据存储在hadoop的序列文件格式 http hadoop apache org common docs current api or
  • Solr:在哪里可以找到 Luke 请求处理程序

    我正在尝试获取 Solr 索引中所有静态和动态字段的列表 另一个SO答案 https stackoverflow com a 16296974 765287建议为此使用 Luke 请求处理程序 它建议在此 url 中查找处理程序 http
  • python sqlite“开始事务”和“提交”命令

    如果我想通过 python 在数据库中启动事务 我必须像这样显式执行 sql 命令 BEGIN TRANSACTION import sqlite3 conn sqlite3 connect db c conn cursor c execu
  • 对原型绑定感到困惑,这个声明

    在下面的代码中 我想知道上下文如何绑定到this In obj myMethod 上下文被赋予对象 因此记录它会给出对象 In var myFun obj myMethod then myFun 上下文被赋予窗口 唯一的区别是您将函数设置为
  • 如何保留超过 5 天的查询日志?

    在 Redshift 中 有一个STL QUERY存储过去 5 天运行的查询的表 我正在尝试找到一种方法来保存超过 5 天的记录 以下是我考虑过的一些事情 有红移设置吗 看来不是 我可以使用触发器吗 Redshift 中不提供触发器 因此这
  • 类库的 app.config 中的绑定重定向有什么作用吗?

    我经常使用的 VS 解决方案包括单个可执行项目 控制台应用程序 网络应用程序 和许多类库项目这些都被可执行文件引用 使用 NuGet 并安装包时 经常会出现app config为每个项目创建的文件 通常只包含合并引用程序集版本的绑定重定向列
  • scala 贷款模式,可选函数参数

    我有一个贷款模式 该模式应用函数 n 次 其中 i 是递增变量 偶尔 我希望传入的函数能够访问 i 但我不想要求传入的所有函数都需要定义一个参数来接受 i 下面的例子 def withLoaner n Int gt op Int gt St