【发布时间】:2018-07-17 07:18:15
【问题描述】:
假设我有两个函数
Func<Id, Option<Employee>> FindEmployee
如果找到Id,则返回员工,否则返回None;
Func<Employee, Option<Entry>> PromptPassword
它会打开一个询问密码的对话框,如果点击确定按钮,它将返回用户条目;如果点击取消,它将返回 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;
}
});
最终结果是一个选项
你看,我想一直提示输入密码,直到用户正确输入密码。但是在Map 中使用while 循环实在是太难看了。
它必须有更好的方法来写这个。谁能给个提示?
谢谢
【问题讨论】:
-
出于好奇,这是哪个 Option
?它来自 F# 还是其他库? -
另外,为什么 PromptPassword 会收到一个 Employee?为什么,如果密码验证发生在以
bool matches = ...开头的行的后面。while(true){...}将永远迭代。我的意思是,无论其优雅程度如何,您的代码 sn-p 都是错误的。它只是行不通。您需要编辑您的问题,以便至少您的 sn-p 代码有意义。 -
@caeus 可能在提示对话框中使用了
emp中的某些值。如果代码为returns,while循环将不会永远迭代。我认为没有理由相信 OP 的代码不起作用。 -
@JLRishe,你说得对。它会让它结束。 “emp”是什么类型的?员工或选项
? -
@caeus 鉴于 OP 正在访问
emp.Password,我想它是Employee。
标签: c# functional-programming language-extension