问题描述
||
考虑以下代码:
type Test () =
member o.fn1 (?bo) = 1
member o.fn2 (?bo) = o.fn1 bo
member o.fn3 (?bo) = 1 + bo.Value
member o.fn4 (?bo) = o.fn3 bo
当fn1
和fn2
正常工作时,fn4
会产生以下错误:
init.fsx(6,30):错误FS0001:该表达式应具有int类型,但此处具有\'a选项
MSDN指出:
可选参数被解释为F#选项类型,因此您可以使用带有Some和None的匹配表达式,以查询选项类型的常规方式查询它们。
对我来说,可选参数不会被解释为F#选项类型,否则代码将被编译。此外,我不明白为什么,当我将鼠标悬停在ѭ5中的?bo
上时,工具提示会显示val bo: int option
,但从外面期望只有int
。我期望一种不接受任何内容的行为,即int,Some int和None。最后一点,我不明白为什么fn2
有效,而fn4
无效。
感谢您的澄清
解决方法
我必须重新考虑正确答案。基于此问题(和答案):
传播可选参数
它接缝正确答案如下:
type Test () =
member o.fn1 (?bo) = 1
member o.fn2 (?bo) = o.fn1 bo
member o.fn3 (?bo) = 1 + bo.Value
member o.fn4 (?bo) = o.fn3 (?bo = bo)
这是一个简洁的功能,功劳归于desco!
,
fn2
之所以有效,是因为fn1
不使用其参数,因此它是通用的\'b option
。
type Test () =
member o.fn1 (?bo1) = 1 --> bo1: \'b option,here \'b = \'a option
member o.fn2 (?bo) = o.fn1 bo -->bo: \'a option
fn4
抱怨传递给fn3
的参数应该是整数,而不是int option
,因为当您指定参数时,您当然需要传递特定的参数。但是您可以选择省略该参数。 fn3
的定义/类型签名不知道您是否指定了ѭ19,,因此它是a17ѭ。请注意,您可能有以下用法:
type Test () =
member o.fn1 (?bo) = 1
member o.fn2 (?bo) = o.fn1 bo
member o.fn3 (?bo) =
match bo with
| Some v -> 1 + bo.Value
| None -> 1
member o.fn4 (?bo) = o.fn3()
没有为fn3
指定参数的地方,但是当您指定参数时,它是具体的int
,而不是int option
。
考虑具有三个参数的绘图函数:
let plot(?x,?y,?color)
因为参数是可选的,所以可以有以下用法:
plot(data)
plot(y=data)
plot(x=data,color=\'r\')
但不是:
plot(Some data)
plot(y=Some data)
plot(x=Some data,color=Some \'r\')