我怎样才能重复调用一个函数直到它 returns None?
How can I repeat calling a function until it returns None?
假设我有 2 个函数
Func<Id, Option<Employee>> FindEmployee
如果找到Id,则return是员工,否则None
;
Func<Employee, Option<Entry>> PromptPassword
它将打开一个对话框询问密码,如果点击确定按钮,它将return用户输入;如果点击取消,它将 return 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;
}
});
最终结果是一个Option
你看,我想一直提示输入密码,直到用户输入正确为止。但是在 Map
中使用 while 循环太难看了。
一定有更好的写法。谁能给个提示?
谢谢
你可以使用 goto 语句吗?然后摆脱 while 循环...
像这样定义一个函数
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);
});
在 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 个函数
Func<Id, Option<Employee>> FindEmployee
如果找到Id,则return是员工,否则None
;
Func<Employee, Option<Entry>> PromptPassword
它将打开一个对话框询问密码,如果点击确定按钮,它将return用户输入;如果点击取消,它将 return 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;
}
});
最终结果是一个Option
你看,我想一直提示输入密码,直到用户输入正确为止。但是在 Map
中使用 while 循环太难看了。
一定有更好的写法。谁能给个提示?
谢谢
你可以使用 goto 语句吗?然后摆脱 while 循环...
像这样定义一个函数
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);
});
在 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;
});