代码之家  ›  专栏  ›  技术社区  ›  Tartar

F:将函数传递给option.bind

  •  0
  • Tartar  · 技术社区  · 6 年前

    我有一个功能 great 具体实施如下

    let great y z = Option.bind (cons (Option.get z) >> Some) y
    

    我的功能如下

    let apply f val = 
      match f with
      | None -> None
      | Some v -> Option.map v val 
    

    如果我给 None 第二个参数的值( z )它给了我一个错误,因为option.get z在 没有 .

    我想避免这个错误而不使用if-else块。我想知道能不能通过 伟大的 要应用的函数,以便它可以评估 没有 当给定的 z 参数为 没有 .

    任何帮助都将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Fyodor Soikin    6 年前

    如果你想执行整个 Option.bind ... 只有当 z Some ,你可以用另一个 Option.bind 为此-这正是 bind 用于:

    let great y maybeZ = 
        Option.bind (fun z -> Option.bind (cons z >> Some) y) maybeZ
    

    或者,更优雅地表达:

    let great maybeY maybeZ = 
        maybeZ |> Option.bind (fun z -> 
        maybeY |> Option.bind (cons z >> Some) )
    

    然后,第一行将读作“bind maybez to z,and…”

    事实上,我也会做同样的事情 y 只是为了增加可读性:

    let great maybeY maybeZ = 
        maybeZ |> Option.bind (fun z -> 
        maybeY |> Option.bind (fun y ->
        Some (z :: y) ) )
    

    或者,您可以使用 Option.map2 ,它的作用是:将一个函数应用于两个 option -当两者都是 一些 :

    let great maybeY maybeZ = 
        Option.map2 (fun y z -> z :: y) maybeY maybeZ
    

    然后你可以减少它(但是,不幸的是,只有 maybeZ ,由于价值限制):

    let great maybeY = 
        Option.map2 (fun y z -> z :: y) maybeY
    

    或者,如果只是反转参数,则可以去掉lambda:

    let great maybeY maybeZ = 
        Option.map2 cons maybeZ maybeY
    
        2
  •  0
  •   gileCAD    6 年前

    您也可以像apply函数一样使用模式匹配来编写这个伟大的函数。

    let great lOpt xOpt = 
        match lOpt, xOpt with
        | Some l, Some x -> Some (x :: l)
        | Some l, None   -> Some l
        | _              -> None