2017-04-06 144 views
2

鑑於鍵/值對的列表:鍵值對F#列表變量賦值

do 
    [("A", 1);("B",2)] 
    |> (fun list -> 
      for item in list do 
       match item with 
       | ("A", x) -> //expression assigning x to variable "A" 
       | ("B", x) -> //expression assigning x to variable "B" 
       | _ -> //default expression 
     ) 

是否有一些表達,我可以寫,將完成同樣的事情

let A = 1 
let B = 2 

我預先知道該列表不超過10個項目,並且這些項目是<字符串,int >的元組,但是事先不知道是否存在「A」或「B」或其他密鑰或列表是空的。

基本上,將列表分解成一組類型化變量。

UPDATE:語境

在我的應用程序的注意事項我剛收到這樣的鍵/值對的列表,由不同的團隊維護的上游項目。我期望某些鍵位於列表中,我希望將其分配給鍵入的變量以供以後處理。如果我需要的東西丟失,我會拋出異常。但是我不想鎖定任何給定的變量名稱,除了預期的名稱。對於他們所有人,我希望能夠在運行時分配它們。

+3

你爲什麼要這樣做?之後你會怎麼做? –

回答

6

如果你想在代碼中稍後對變量做些什麼,那麼它們將需要在範圍內 - 所以你不可避免地必須以某種方式聲明變量。最簡單的辦法是讓他們易變和變異他們根據列表中的值:

let mutable A = 0 
let mutable B = 0 

爲了使突變更容易一點,你可以創建setter方法查找表:

let setters = 
    dict [ ("A", fun x -> A <- x); ("B", fun x -> B <- x) ] 

現在,這可以讓你遍歷輸入,使用字典查找來獲得相應的setter並調用它來設置變量值:

for var, value in [("A", 1);("B",2)] do 
    setters.[var] value 

有了您的q的有限範圍內問題,要說這是否是一個很好的方式來實現真正激發你的問題的方法 - 作爲F#代碼,它確實看起來有點醜陋,而且如果你添加更多的上下文,有人可能會提出更好的建議辦法。

+0

給原帖增加了一些背景 – user1443098

1

這聽起來像你有一個可以和一個地圖來表示一些動態數據:

let data = Map [ ("A", 1); ("B", 2) ] 

let a = Map.find "A" data 
// throws an exception if "A" is not present 

let b = Map.find "B" data 
// throws an exception if "B" is not present 

let c = Map.tryFind "C" data 
// "C" is not present so c = None 

注意:在F#中的約定是綁定的名稱(變量名)開始用小寫字母。

+0

不錯!那會很好! – user1443098