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

时间:2011-06-15 06:29:47

标签: f# types option optional-parameters

请考虑以下代码:

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

虽然fn1fn2工作得很好,fn4会产生以下错误:

  

init.fsx(6,30):错误FS0001:此表达式应该是int类型,但这里有类型'a option

MSDN州:

  

可选参数被解释为F#选项类型,因此您可以通过使用具有Some和None的匹配表达式以查询选项类型的常规方式查询它们。

对我来说,可选参数不会被解释为F#选项类型,否则代码将被编译。此外,我不明白为什么,当我将?bo悬停在fn3 {}}}时,工具提示会显示val bo: int option但是来自外部只需要int。我期望一个接受任何东西的行为,int,Some int和None。作为最后一点,我不明白为什么fn2有效但fn4没有。

感谢您的澄清

3 个答案:

答案 0 :(得分:8)

我必须重新考虑正确的答案。基于这个问题(和答案):

Propagating optional arguments

它找到了正确的答案如下:

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

答案 1 :(得分:4)

  1. 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
    
  2. fn4抱怨传递给fn3的参数应该是int,而不是int option,因为当您指定参数时,您当然需要传递一个特定的参数一。但您可以选择省略参数。 fn3的定义/类型签名不知道您是否指定了bo,因此它是int option。请注意,您可能有以下用法:

    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()
    
  3. 您没有为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')
    

答案 2 :(得分:1)

F# 不需要匹配来传递可选参数。 使用绘图示例:

type Plotter() =
    static member Plot(?x,?y,?color) = 
        printfn $"{x}, {y}, {color}" // Do something "plottish" here

type PlotUser() =
    static member MyPlotUser(?x, ?y, ?color) =
        Plotter.Plot(?x = x, ?y = y, ?color = color)

/// Perform calls
PlotUser.MyPlotUser(10) // => Some(10), , 
PlotUser.MyPlotUser(10, color = "Green") // => Some(10), , Some(Green)

以上允许您使用自己的可选参数调用 plot。 /JEE,夏普#Soft