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

您需要使用可变变量 - 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 回答
2

@John Palmer 有你的答案,但我会补充一点......

请注意,您的代码编译但不能按预期工作的原因是因为在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 回答
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 回答