首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >F#参考传递

F#参考传递
EN

Stack Overflow用户
提问于 2015-05-11 08:28:06
回答 4查看 2.5K关注 0票数 1

我试图在F#中传递参考信息。在C#中,使用ref和out关键字非常容易,但在F#中,它似乎没有那么简单。我刚读到:http://davefancher.com/2014/03/24/passing-arguments-by-reference-in-f/,它建议使用引用单元格。(我想这意味着在C#中没有模拟out关键字,在这里您不需要初始化一个变量就可以传递它。)

但是无论如何,我想知道这是否是在F#中传递引用的最佳/唯一方式,在函数式语言中这是否是一个好主意。

编辑:

我之所以感兴趣,是因为我刚刚意识到异常正在减缓我的代码。我正在进行一场消灭他们的运动。基本上,我的计划是:假设一个函数返回一个double,或者在出现错误时抛出一个异常。相反,我将通过引用传递一个double和一个ErrorCode类型作为位掩码,然后将值和错误向下传递。我猜我得让所有这些变量都变了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-11 09:04:55

你的问题有几个部分,我将试着回答:

  • 这意味着使用一个参考单元格
代码语言:javascript
运行
AI代码解释
复制
- Yes, Reference Cells (or ref cells) are the idiomatic way to pass mutable data into a function

  • 我想这意味着在C#中不存在对out关键字的模拟,在这里您不必初始化一个变量才能传递它。
代码语言:javascript
运行
AI代码解释
复制
- C# usually uses `out` parameters to signify additional return values. The idomatic way to do that in F# is with tuples. For example the C# function `int TryParse(string s, out bool succeeded)` is simply `TryParse(s : string) -> (int, bool)`

  • 如果这在函数式语言中是个好主意的话。
代码语言:javascript
运行
AI代码解释
复制
- This is certainly not what I would consider to be normal, idiomatic F# code. The way I would represent this would be with a Discriminated Union representing the possible results:

代码语言:javascript
运行
AI代码解释
复制
type MyFunctionResult = 
    | Success of double
    | ErrorCase1
    | ErrorCase2 of AddditionalDataType

如果您有许多使用这种样式的函数,那么它就是 function

票数 4
EN

Stack Overflow用户

发布于 2015-05-11 08:40:37

您可以使用&而不是C#的ref,但是以&作为前缀的变量必须是可变的。

代码语言:javascript
运行
AI代码解释
复制
  open System.Collections.Generic
  let dic = new Dictionary<string, string>()
  dic.Add("key", "myvalue")
  let mutable v = "" // v is mutable
  let success = dic.TryGetValue("key", &v);
  System.Console.WriteLine(v)
  let succ, value = dic.TryGetValue("key") // this is what Mark Seemann says is the comment, a shortcut for C#'s `Try...(.., out ...)` is using tuples in F#
票数 3
EN

Stack Overflow用户

发布于 2015-05-11 08:34:36

让我描述一下OCaml所做的事情,因为我不知道F#,而且有人可以确认F#非常相似,因此我的答案也适用。

在函数式编程语言(如OCaml或F# )中,默认情况下数据是不可变的。也就是说,您需要在事物发生变化之前声明它们是可变的,实际上,可变的数据结构不像不可变的数据结构那么常见(但并不少见)。

现在,由于数据在默认情况下是不可变的,因此如何传递参数并不重要,因为它们无论如何都不会被更改。在这种情况下,通过值传递简单的数据类型是有意义的,而其他的类型则通过引用传递到寄存器中。

当然,可变数据类型是通过引用传递的,否则就没有什么价值了。

也许你可以给我们举个例子来说明你想做什么。您是传递可变的还是不变的数据?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30172904

复制
相关文章
Write your own Excel in 100 lines of F#
I've been teaching F# for over seven years now, both in the public F# FastTrack course that we run at SkillsMatter in London and in various custom trainings for private companies. Every time I teach the F# FastTrack course, I modify the material in one way or another. I wrote about some of this interesting history last year in an fsharpWorks article. The course now has a stable half-day introduction to the language and a stable focus on the ideas behind functional-first programming, but there are always new examples and applications that illustrate this style of programming.
仇诺伊
2020/04/24
6650
Write your own Excel in 100 lines of F#
红队技巧之F#利用
F # 是一种函数编程语言,可方便编写正确且可维护的代码。F # 编程主要涉及如何定义自动推断和通用化的类型和函数。这样,你的关注点将保留在问题域上并操作其数据,而不是编程的详细信息。
鸿鹄实验室
2021/07/06
1.5K0
红队技巧之F#利用
指针值传递、地址传递和引用传递
执行结果中并未输出字符串hello其实这里主函数调用fun函数,形参向实参传递参数的时候,发生的是拷贝。在fun函数中对局部指针变量p的任何修改都不会影响到主函数中的指针变量p。 下面简单的用函数栈帧空间图分析一下:
lexingsen
2022/02/24
1.8K0
指针值传递、地址传递和引用传递
细说值传递、引用传递和地址传递
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
闫同学
2023/10/14
2450
Java的参数传递是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?    答:是按值传递。Java 语言的参数传递只有按值传递。当一个实例对象作为参数被传递到方
nnngu
2018/03/15
3.3K0
Java的参数传递是值传递还是引用传递
Java 参数传递是值传递还是引用传递?
首先把结论表明,Java 的参数传递是值传递,因为有部分细节让人引起误解以为是引用传递,故我们写两个例子来举例探讨。
萬物並作吾以觀復
2019/05/10
2.9K0
java中的参数传递-值传递、引用传递
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。
chenchenchen
2022/11/29
4.7K0
java中的参数传递-值传递、引用传递
值传递与引用传递
“哥,说说 Java 到底是值传递还是引用传递吧?”三妹一脸的困惑,看得出来她被这个问题折磨得不轻。
沉默王二
2021/06/16
1.2K0
值传递与引用传递
参考
Sketch中的插件系统可让您完全访问应用程序的内部结构和macOS中的核心框架。所以你有一个巨大的力量来构建几乎任何东西。 然而,伟大的力量有很大的责任,所以你需要在每个Sketch版本中留意你的代码。我们会在重构时不时更改Sketch的内部结构,因此您的插件可能会调用一些已重命名或删除的方法。 我们确实意识到这当然不是理想的。这就是为什么我们支持内部和插件之间的JavaScript API。我们希望它覆盖了90%的用例。如果没有,您可以随时进入内部,风险自担。 下面的页面包含插件可以侦听的所有操作的简要
iOSDevLog
2018/05/17
7830
值传递和引用传递
  java应用程序有且只有一种参数传递机制,即按值传递。   按值传递:当将一个参数传递给一个函数的时候,函数接收的是原始值的一个副本,因此,如果函数修改了该参数,仅仅修改的是参数的副本,而原始值保持不变。按引用传递一位置当一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。   1.对象是按照引用传递;   2.java中仅存在一种参数传递机制,即按值传递;   3.按值传递意味着当一个参数传递给一个函数的时候,函数接收
Mister24
2018/05/14
1.6K0
dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
本文来安利大家一个有趣而且强大的库,通过 F# 和 C# 混合编程编写 WPF 应用,可以在 WPF 中使用到 F# 强大的数据处理能力
林德熙
2021/05/20
1.8K0
ONNX模型 NuGet指南 异步编程技巧 F#有未来?
内容 Using .NET Hardware Intrinsics API to accelerate machine learning scenarios 用硬件加速机器学习 Fantomas
杜金房
2020/12/21
6290
ONNX模型 NuGet指南 异步编程技巧 F#有未来?
按值传递还是引用传递?
改变u的指向不会影响user,但如果改变u指向实例的内容name,那么就会影响到user了
晚上没宵夜
2020/05/06
1.1K0
python中值传递还是引用传递?
首先,Python中一切事物皆对象,变量是对对象在内存中的存储和地址的抽象。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。
Tim在路上
2020/08/04
1.3K0
Java 引用传递和值传递
这个问题的关键在于 a,b,x,y 的地址指向; y = x 与 b = a 是不等价的!! 发生改变的是 y 指向的值变成了和 x 指向的相同, 此时 y = AB(因为append方法改变的x原有的值) 而此时 b 的指向并没有发生改变。
星尘的一个朋友
2020/11/25
1.2K0
Java-值传递、地址传递
运行结果: TestParameterTransfer@15db9742 李太白 TestParameterTransfer@15db9742 李寻欢 TestParameterTransfer@15db9742 李寻欢
Fisherman渔夫
2019/07/30
1.3K0
java中值传递和引用传递
public static void main(String[] args) {int a=1;change(a);System.out.println("交换a后的值:" a);}
chenchenchen
2019/11/05
8220
Java值传递与引用传递
Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?   答案基本上是:值传递 说明:得出这种结论的前提必须是
阳光岛主
2019/02/19
1.1K0
C中值传递与地址传递
#include <stdio.h> void print(int a) { (a)++; printf("a=%d\n",a); } int main(void) { int b = 6; print(b); printf("%d\n" ,b); return 1; } //这种情况下就属于值传递,因为作用域和内存模型的原因,生命周期消亡,数据消失,故最后数据不变。 #include <stdio.h> void print(int * a) { (*a)++; prin
用户5166556
2019/04/16
5470
java — 值传递和引用传递
  在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。   Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。  java实际上只有值传递,没有真正意义上的引用传递。 按值传递意味着当将一个参数传递给一
Mister24
2018/05/14
1.5K0

相似问题

在F#中传递` Pass‘参数(作为参考)

16

功能参考传递

29

参考传递UIButton

24

找不到F#库的参考组件

13

参考其他F# Jupyter笔记本

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文