.net - F#:函数中有更多返回点,如何处理?

标签 .net f# functional-programming return unit-type

在复杂函数中返回值时遇到问题。例子总是更好:

考虑以下函数:

let myf (mypar: int) =
   mypar + 1

好吧,这里没有问题,这个函数编译正确,签名是:
val myf: int -> int

好吧好吧。现在考虑这个代码:
let myf (mypar: int) =
   if mypar = 2 then
      4 (* ERROR *)
   mypar + 1

这不起作用:

这个表达式应该有类型 unit 但这里有 int

当我在 if 中时,每次尝试从我的函数返回时都会引发此错误, while for或每隔一个块。我认为问题是确保所有可能的返回路径都返回相同的类型,但在这里我不明白会发生什么。

请注意,如果我插入 ()单位一切正常,例如:
let myf (mypar: int) =
   if mypar = 2 then
      () (* No error *)
   mypar + 1

但是那个单元不会让我的函数返回!!!它继续!!!
此外,你能解释一下 F# 是如何处理的吗???

谢谢

最佳答案

要添加更多细节,您的方法的问题在于 F# 中的所有内容都是表达式。这使得对您的程序进行推理变得更加容易(因为您不需要跟踪当前正在执行的语句),但这意味着您始终必须编写完整的表达式。

如果您尝试编写类似 return 的内容,就好像您在 C# 中编写了以下内容(这可能解释了为什么 F# 不允许这种事情):

int a = 10 + (3 * (return 10; 2));
return a;

为什么你写if .. then ()的时候没有报错? ()表达式创建了一个 unit 类型的值这很特别,因为它只有一个有效值。 F# 允许你写 if .. then没有 else返回时unit ,因为可以算出else分支必须返回唯一存在的单位值,因此它会将您的代码视为:
if something then ()
else () // implicitly added by the compiler

唯一的区别是抛出一个异常(使用 raise ),它的行为就像在 C# 中一样。您可以使用异常跳出函数,但最好重写代码以获得完整的有效表达式。

关于.net - F#:函数中有更多返回点,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068446/

相关文章:

c# - 在 .NET Web 应用程序中获取当前目录

f# - 如何引用封装在单例区分联合中的元组的第一个元素

f# - 为什么 'printf "%A"None' 输出 null

python - 管道中的函数式编程和 python pandas 数据帧

javascript - 组合一些数组项

.net - GetReferencedAssemblies不会返回所有程序集

c# - 如何从 wpf 中的 DataGridCellinfo 类中提取 DataGridCell

c# - 如何从 Process.Start 打开指向同一浏览器窗口或选项卡的链接?

f# - 带有 List.map 的部分函数应用

haskell - 为什么守卫被称为 'guards' ?