F#Pattern与lambdas匹配

时间:2009-07-20 12:42:54

标签: f#

如果输入为“0”,我想将IsParentRoot的值设置为“0”,否则执行一些代码:

    let isParentRoot parVal =
        match parVal with
        | "0" -> "0"
        | x -> (fun x -> 
            "something")

我正在尝试这个,但这不会编译错误“This function takes too many arguments, or is used in a context where a function is not expected”。任何的想法? 感谢

3 个答案:

答案 0 :(得分:3)

你不是必须为你的函数提供一个参数来编译吗?

这样的东西
let isParentRoot parVal =
  match parVal with
    | "0" -> "0"
    | x -> (fun y -> "something") x

因为否则最后一个匹配会尝试返回一个返回字符串的函数,而第一个匹配将返回一个字符串。不允许混合两者。

但我认为你的方法可能在这里错了。函数返回值(或unit)。如果你想明确地改变某些东西,那么一般的功能习惯是返回一个新的值,你改变了想要改变的东西。使用副作用进行编程(如果 foo ,你将其设置为“0”,如果不是“那么就完全做其他事情”)就像非FP一样。但我仍然是一名F#初学者,两天前刚开始研究这种语言,所以我可能会错在这里。

答案 1 :(得分:2)

函数的所有可能返回值必须属于同一类型。所以你的情况不起作用,因为在一个分支中你返回一个字符串,而在另一个分支中你返回一个函数。

这样可行:

let isParentRoot parVal =
        match parVal with
        | "0" -> (fun _ -> "0")
        | x   -> (fun _ ->  "something")

如果您真的希望自己的案例有效,可以将两个返回值向上转换为Object。

答案 2 :(得分:1)

此时你不需要定义lamba,我相信你可以写:

let isParentRoot parVal =
    match parVal with
    | "0" -> "0"
    | x -> CODE BLOCK
           GOES HERE

即。将x附加到列表并读出列表(只是这里有有意义的代码)你可以写:

let isParentRoot parVal =
    match parVal with
    | "0" -> "0"
    | x -> let roots = List.append oldroots x
           List.iter (fun r -> printfn "root: %s" r.ToString()) roots

假设您之前已经定义了您的老根列表。