假设我有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循环是如此丑陋。
必须有更好的方法来写这个。任何人都可以提示吗?
谢谢
答案 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循环...