[英]F# Pattern Matching with lambdas
如果输入为“ 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
”错误一起编译。 任何想法? 谢谢
您是否不必为函数提供参数以进行编译?
就像是
let isParentRoot parVal =
match parVal with
| "0" -> "0"
| x -> (fun y -> "something") x
因为否则最后一个匹配项将尝试返回一个返回字符串的函数,而第一个匹配项将返回一个字符串。 不允许同时混合两者。
但是我认为您的方法在这里可能是错误的。 函数返回值(或unit
)。 如果要显式更改某些内容,则一般的功能惯用法是在更改了要更改的内容后返回一个新值。 具有副作用的编程(如果将foo设置为“ 0”,如果没有,则完全设置为“ 0”),这与非FP类似。 但是我仍然是F#初学者,只是两天前才开始研究该语言,所以在这里我可能会误会。
函数的所有可能的返回值都必须是同一类型。 因此,您的情况不起作用,因为在一个分支中您将返回一个String,而在另一分支中您将返回一个函数。
这将工作:
let isParentRoot parVal = match parVal with | "0" -> (fun _ -> "0") | x -> (fun _ -> "something")
如果您确实希望您的案例能够正常工作,则可以将两个返回值都转换为Object。
您现在无需定义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
假设您之前已经定义了oldroots列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.