.net F#can';我不理解我的多个参数值的界限。为什么?
实际上,我在F#编译器方面面临着一个潜在的奇怪问题。以下代码给了我一个错误,我不明白为什么:.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
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在你的答案上。.-]