使用F#的可选参数和选项类型

问题描述

|| 考虑以下代码
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\')