我发现旧版代码的一个参数的类型为
#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中意味着什么?
答案 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