我有以下函数来设置HttpWebRequest
的Http标题。
type Http private() =
....
static member InnerRequest(url:string, forceText, ?query, ?headers, ....)
....
for header, value in headers do // : #seq<string * string>
match header with
| StringEquals "accept" -> req.Accept <- value
| ....
| _ -> req.Headers.[header] <- value)
我可以传递seq
string * string
的函数。
let headers = [
"accept", "*/*";
"Accept-Encoding", "gzip,deflate,sdch";
"Accept-Charset", "UTF-8,*;q=0.5" ]
但是,我还想设置类型为KeepAlive
的{{1}}和AlowAutoRedirect
。以下代码将失败。
bool
在F#中实现它的好方法是什么?
答案 0 :(得分:4)
discriminated union将成为F#-ish的方式;你可以为string
有价值的东西使用一个案例,为bool
有价值的东西使用另一个案例。
鉴于对于模式匹配中的某些情况,您明确设置了一个特定的属性,它也可能分别为每个属性设置一个案例:
type Headers =
| StringHeader of string * string
| BoolHeader of string * bool
| Accept of string
...
然后
let headers =
[Accept "*/*" ;
StringHeader ("Accept-Encoding", "gzip,deflate,sdch") ;
BoolHeader ("KeepAlive", true) ]
并在您的InnerRequest
代码中:
for header in headers do
match header with
| StringHeader (name, value) -> req.Header.[name] <- value
| BoolHeader (name, value) -> ... // however you set a bool property
| Accept value -> req.Accept <- value
| ...