2012-06-11 63 views
0
let tag:String = "+1" 
for str in readFile do 
    let feature = str.Split [|' '; '\t'|] 
    if feature.[8] = "0" then 
     tag = "-1" 
    else 
     tag = "+1" 

    printf "\n%s %s\n" feature.[8] tag 

如果特徵[8],代碼更改嘗試將tag的值更改爲「-1」。爲0,否則爲「+1」。然而,標籤變量值始終保持「+1」,而不管值的特徵如何。是。F#中的標誌變量不變F#

如何處理基於F#中條件語句的簡單值更改?

回答

2

@約翰 - 帕爾默有你的答案,但我會有點給它添加...

需要注意的是,爲什麼你的代碼編譯,但像您期望的不工作的原因是因爲=操作在tag = "-1"tag = "+1"的上下文中使用是相等運算符。所以這些表達式是有效的,但返回值爲bool。但是,您應該收到以下警告:

此表達式應具有類型'單元',但類型爲'bool'。使用 'ignore'放棄表達式的結果,或者'let'將 結果綁定到名稱。

在您的F#編碼冒險中,您會注意到這個警告。

另外請注意,你可以寫(除其他替代功能的方法)使用Seq.fold您在純功能的單向算法(不包括可變的變量):

let tag = 
    readFile 
    |> Seq.fold 
     //we use the wild card match _ here because don't need the 
     //tag state from the previous call 
     (fun _ (str:string) -> 
      let feature = str.Split [|' '; '\t'|] 
      //return "-1" or "+1" from the if/then expression, 
      //which will become the state value in the next call 
      //to this function (though we don't use it) 
      if feature.[8] = "0" then 
       "-1" 
      else 
       "+1") 
     ("+1") //the initial value of your "tag" 
2

您需要使用可變變量 - 默認情況下,F#中的變量是常量。另外,<-是賦值運算符。

let mutable tag:String = "+1" 
for str in readFile do 
    let feature = str.Split [|' '; '\t'|] 
    if feature.[8] = "0" then 
     tag <- "-1" 
    else 
     tag <- "+1" 

    printf "\n%s %s\n" feature.[8] tag 
1
for str in readFile do 
    let feature = str.Split [|' '; '\t'|] 
    let tag = if feature.[8] = "0" then "-1" else "+1" 

    printf "\n%s %s\n" feature.[8] tag