类型#seq <string>选项是否必要?

时间:2018-08-27 18:38:27

标签: f#

我发现旧版代码的一个参数的类型为

#seq<string> option

,该参数用作

for k,v in defaultHeaders |> Seq.filter(fun (k,_) -> 
    match headers with 
    | Some hs -> not(Seq.exists(fun y -> fst y = k) hs)
    | None -> true
    ) do
    client.DefaultRequestHeaders.Add(k, v)

它只能在代码中的参数Seq.empty中使用None。是否有#seq<string> option类型的有效用例? #在类型信息btw中意味着什么?

1 个答案:

答案 0 :(得分:2)

为什么要使用print("The characters name is {} and age is {}".format(King.name, King.age))参数?

在参数中使用seq option类型的一个可能原因是在非咖喱(即元组样式)方法中使用optional parameters。如果您有一个声明为option的参数,则它将为?param类型,其中Foo是Foo option的“常规”类型(即不是可选参数)。这使您可以编写如下代码(从MSDN文档逐字复制示例):

param

这里的可选参数在type DuplexType = | Full | Half type Connection(?rate0 : int, ?duplex0 : DuplexType, ?parity0 : bool) = let duplex = defaultArg duplex0 Full let parity = defaultArg parity0 false let mutable rate = match rate0 with | Some rate1 -> rate1 | None -> match duplex with | Full -> 9600 | Half -> 4800 do printfn "Baud Rate: %d Duplex: %A Parity: %b" rate duplex parity let conn1 = Connection(duplex0 = Full) let conn2 = Connection(duplex0 = Half) let conn3 = Connection(300, Half, true) 类型的构造函数中,但是您可以看到它们的工作方式。至于您对Connection参数的具体问题,我将不得不稍微调整一下MSDN docs示例以证明两者之间的区别。如果这些可选参数之一是一个序列(例如,代表首选利率和回退率的整数序列),那么带有或不带有可选参数的情况如下所示:

seq option

为seq使用可选参数使调用者可以跳过指定该参数的步骤,这在某些情况下可以使您的API更好地使用。因此,这可能是在参数中使用type Connection(?rates : seq<int>) = // Final type will be `seq<int> option` let realRates = defaultArg rates Seq.empty let chosenRate = realRates |> Seq.find (fun r -> ...) type ConnectionB(rates : seq<int>) = // Final type will be `seq<int>` let chosenRate = rates |> Seq.find (fun r -> ...) let conn1 = Connection() // Equivalent to passing `Seq.empty` let conn2 = Connection(Seq.empty) let conn3 = ConnectionB() // Compiler error; this is not allowed let conn4 = ConnectionB(Seq.empty) 的原因之一。有时则没有意义;一切都取决于您希望API如何看待外部代码。

类型声明中的seq option呢?

关于您关于#字符的问题,在MSDN文档中称为flexible types,它是类型约束的简写:#的类型声明与声明相同类型为#Foo。使用'T when 'T :> Foo的特定优势在于F#通常不会在兼容类型之间隐式自动转换,并且需要针对以下情况进行显式强制转换(同样,示例从MSDN文档中逐字记录):

#seq