在复杂函数中返回值时遇到问题。例子总是更好:
考虑以下函数:
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/