Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net F#can';我不理解我的多个参数值的界限。为什么?_.net_F# - Fatal编程技术网

.net F#can';我不理解我的多个参数值的界限。为什么?

.net F#can';我不理解我的多个参数值的界限。为什么?,.net,f#,.net,F#,实际上,我在F#编译器方面面临着一个潜在的奇怪问题。以下代码给了我一个错误,我不明白为什么: yield Animal( AnimalType(animal.AnimalType.Value), error-->if Option.isSome animal.AnimalSubType then Some(AnimalSubType(animal.AnimalSubType.Value)) else None, AnimalSpecificSubTy

实际上,我在F#编译器方面面临着一个潜在的奇怪问题。以下代码给了我一个错误,我不明白为什么:

    yield Animal(
        AnimalType(animal.AnimalType.Value),
error-->if Option.isSome animal.AnimalSubType then Some(AnimalSubType(animal.AnimalSubType.Value)) else None,
        AnimalSpecificSubType(animal.AnimalSpecificSubType.Value)
        )
编译器抱怨Animal应该接受3个参数,但实际上只接受2个。我想这是因为它没有意识到if参数以行的结尾(逗号)结束。我可以通过在有问题的行周围添加()来运行代码:

    yield Animal(
        AnimalType(animal.AnimalType.Value),
--> OK  (if Option.isSome animal.AnimalSubType then Some(AnimalSubType(animal.AnimalSubType.Value)) else None),
        AnimalSpecificSubType(animal.AnimalSpecificSubType.Value)
        )
但我想了解这个问题。为什么这可以解决问题,例如,这不能解决问题

    yield Animal(
        AnimalType(amimal.AnimalType.Value),
error-->if (Option.isSome animal.AnimalSubType) then (Some(AnimalSubType(animal.AnimalSubType.Value))) else (None),
        AnimalSpecificSubType(animal.AnimalSpecificSubType.Value)
        )
我没有查过F#的语法,但我猜每次F#看到一个
if
子句时,它都会看到一个
else
子句,后面可能跟着一个
else
子句。我想只要我小心使用
else
子句,一切都会好起来的


这是怎么回事?

编译器将错误行末尾的逗号解释为
else
分支返回的元组的一部分,即

yield Animal(
    a,
    if c then Some(b) else None,
    d 
    )
yield Animal(
    a,
    if c then Some(b) else (None),
    d 
    )
解析为:

yield Animal(
    a,
    if c then Some(b) else ((None, ...? )
    d 
    )
yield Animal(
    a,
    if c then Some(b) else ((None), ...? )
    d 
    )
这就是为什么第一个修复有效,而不是第二个修复,因为在第二个修复中添加括号只是包装幻影元组的第一个元素,而不是元组本身,即:

解析为:

yield Animal(
    a,
    if c then Some(b) else ((None, ...? )
    d 
    )
yield Animal(
    a,
    if c then Some(b) else ((None), ...? )
    d 
    )

编译器将错误行末尾的逗号解释为
else
分支返回的元组的一部分,即

yield Animal(
    a,
    if c then Some(b) else None,
    d 
    )
yield Animal(
    a,
    if c then Some(b) else (None),
    d 
    )
解析为:

yield Animal(
    a,
    if c then Some(b) else ((None, ...? )
    d 
    )
yield Animal(
    a,
    if c then Some(b) else ((None), ...? )
    d 
    )
这就是为什么第一个修复有效,而不是第二个修复,因为在第二个修复中添加括号只是包装幻影元组的第一个元素,而不是元组本身,即:

解析为:

yield Animal(
    a,
    if c then Some(b) else ((None, ...? )
    d 
    )
yield Animal(
    a,
    if c then Some(b) else ((None), ...? )
    d 
    )

问题与如何在F#中创建元组有关:

这表明编译器认为
test
采用了两个参数,但编译器认为这两个参数是什么?由于这种类型的函数实际上只是将单个参数作为元组的函数,因此我们可以对这行代码进行如下解构:

> 1, if true then Some 1 else None,1;;

  1, if true then Some 1 else None,1;;
  ----------------------------^^^^^^

stdin(19,29): error FS0001: This expression was expected to have type
    int option    
but here has type
    'a * 'b
因此,您可以看到编译器将
None,1
视为
if
表达式的
else
中的表达式,这就是编译器希望使用
int选项的原因。为了防止出现这种情况,您需要向编译器指出
if
表达式的开始和结束位置。实现这一点的最简单方法是简单地用括号括起来,如下所示:

> 1,(if true then Some 1 else None),1;;
val it : int * int option * int = (1, Some 1, 1)

现在我们得到了预期的元组。

问题与如何在F#中创建元组有关:

这表明编译器认为
test
采用了两个参数,但编译器认为这两个参数是什么?由于这种类型的函数实际上只是将单个参数作为元组的函数,因此我们可以对这行代码进行如下解构:

> 1, if true then Some 1 else None,1;;

  1, if true then Some 1 else None,1;;
  ----------------------------^^^^^^

stdin(19,29): error FS0001: This expression was expected to have type
    int option    
but here has type
    'a * 'b
因此,您可以看到编译器将
None,1
视为
if
表达式的
else
中的表达式,这就是编译器希望使用
int选项的原因。为了防止出现这种情况,您需要向编译器指出
if
表达式的开始和结束位置。实现这一点的最简单方法是简单地用括号括起来,如下所示:

> 1,(if true then Some 1 else None),1;;
val it : int * int option * int = (1, Some 1, 1)

现在我们得到了期望的元组。

lol,马上。但这是一个复制粘贴问题。我已经在OP中修复了它。这似乎是一个很好的猜测。对不起,我删除了它,因为在这种情况下它不会进行类型检查。但可能因为args错误的不匹配,它没有走那么远。但这是一个复制粘贴问题。我已经在OP中修复了它。这似乎是一个很好的猜测。对不起,我删除了它,因为在这种情况下它不会进行类型检查。但是,可能由于args错误不匹配,它没有走那么远。它不是使
d
成为第二个参数的一部分吗?也就是说,
产生动物(a,((如果是c,那么一些(b)没有),d))
?@mydogisbox:对,因此编译器抱怨
动物
构造函数只有两个参数+1在你的答案上。.-]它不是使
d
成为第二个参数的一部分吗?也就是说,
产生动物(a,((如果是c,那么一些(b)没有),d))
?@mydogisbox:对,因此编译器抱怨
动物
构造函数只有两个参数+1在你的答案上。.-]