2014-01-09 26 views
2

我有以下功能來設置HttpWebRequest的Http標頭。與adhoc類型的元組的seq?

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) 

我可以傳遞函數的一個string * stringseq

let headers = [ 
    "accept", "*/*"; 
    "Accept-Encoding", "gzip,deflate,sdch"; 
    "Accept-Charset", "UTF-8,*;q=0.5" ] 

不過,我也想設置KeepAliveAlowAutoRedirect其中有bool類型。以下代碼將失敗。

let headers = [ 
    "accept", "*/*"; 
    "Accept-Encoding", "gzip,deflate,sdch"; 
    "Accept-Charset", "UTF-8,*;q=0.5"; 
    "KeepAlive", true ] // cannot have bool here 

什麼是在F#中實現它的好方法?

回答

4

A discriminated union將是F#方式來做到這一點;你可以使用一個案例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 
    | ... 
+0

謝謝。這將是一個很大的歧視聯盟。我已經更新了這個問題,它顯示了很多標題是由'req.Headers。[header] < - value'設置的。有沒有使用歧視工會的方法? – ca9163d9

+0

只做兩個例子,一個是'string * string',另一個是'string * bool'。 – mydogisbox

+0

我更新了我的答案。 –