1

假设我有 2 个功能

Func<Id, Option<Employee>> FindEmployee

如果找到 ID,则返回员工,否则返回None

Func<Employee, Option<Entry>> PromptPassword

它将打开一个询问密码的对话框,如果点击 OK 按钮,它将返回用户条目;如果取消被击中,它将返回 None

我想有一种优雅的方式来组合这两个功能,基本上我想做:

FindEmployee.Map(emp => 
  {
     while (true)
     {
         var result = PromptPassword (emp);
         if (result.IsNone)
         {
             return false;
         }

         bool matched = result.Where(a => a.EntryContent == emp.Password)
                              .Some(r => true)
                              .None(false);
         if (matched)
             return true;
      }
  });

最终结果是一个选项你看,我想一直提示输入密码,直到用户正确输入。但是在 a 中使用 while 循环Map实在是太难看了。

它必须有更好的方法来写这个。谁能给个提示?

谢谢

4

3 回答 3

1

定义这样的函数

bool Insist(Employee:emp){
  var result = PromptPassword (emp);
  if (result.IsNone)
  {
     return false;
  }

  bool matched = result.Where(a => a.EntryContent == emp.Password)
                              .Some(r => true)
                              .None(false);
  if(matched)
  {
     return true;
  }else
  {
     return Insist(emp);
  }

}

然后你可以去

FindEmployee(id).Map(emp => 
  {
     return Insist(emp);
  });
于 2018-02-07T10:28:28.633 回答
1

在 F# 中,我可能会这样表达您的算法:

findEmployee |> Option.map (fun emp ->
    let rec loop () =
        match PromptPassword emp with
        | None -> false
        | Some a -> a.EntryContent = emp.Password || loop ()
    loop ())

C# 中的等价物可能如下所示:

FindEmployee.Map(emp =>
    {
        do {
            var result = PromptPassword(emp);
            if (result.IsNone) return false;
        } while (result.Where(a => a.EntryContent == emp.Password).IsNone);
        return true;
    });
于 2018-02-07T11:06:38.510 回答
-5

您可以使用 goto 语句对吗?然后摆脱while循环......

于 2018-02-07T05:43:03.287 回答