繁体   English   中英

F#模式与Lambda匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM