如何重复调用函数直到它返回None?

时间:2018-02-07 05:05:36

标签: c# functional-programming language-extension

假设我有2个功能

[mysqld] lower_case_table_names=1

如果找到Id,则返回员工,否则Func<Id, Option<Employee>> FindEmployee;

None

它会打开一个要求输入密码的对话框,如果点击OK按钮,它将返回用户输入;如果取消了取消,它将返回无

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

Func<Employee, Option<Entry>> PromptPassword

最终结果是选项 你看,我想继续提示输入密码,直到用户正确输入密码。但是在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; } }); 中使用while循环是如此丑陋。

必须有更好的方法来写这个。任何人都可以提示吗?

谢谢

3 个答案:

答案 0 :(得分: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);
  });

答案 1 :(得分: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;
    });

答案 2 :(得分:-5)

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