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 

tagコードの変更は、feature.[8] の場合、値を「-1」に変更しようとします。0、またはそれ以外の場合は「+1」です。ただし、タグ変数の値は、値の機能に関係なく、ずっと「+1」のままです。[8] は。

F# の条件ステートメントに基づく単純な値の変更をどのように処理しますか?

4

3 に答える 3

2

@ジョンパーマーはあなたの答えを持っていますが、私はそれに少し追加します...

コードがコンパイルされても期待どおりに機能しない理由は、 and=のコンテキストで使用される演算子が等式演算子であるためです。したがって、これらの式は有効ですが、値を返します。ただし、次の警告が表示されるはずです。tag = "-1"tag = "+1"bool

この式のタイプは「unit」である必要がありますが、タイプは「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"
于 2012-06-11T04:07:25.400 に答える
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 
于 2012-06-11T02:58:17.540 に答える
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 
于 2012-06-11T12:24:55.420 に答える