一组具有特殊类型的元组?

时间:2014-01-09 22:17:43

标签: f#

我有以下函数来设置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#中实现它的好方法是什么?

1 个答案:

答案 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 
    | ...