如果输入为“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
”。任何的想法?
感谢
答案 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
假设您之前已经定义了您的老根列表。