【发布时间】:2015-11-21 18:23:50
【问题描述】:
我需要在 Erlang 中制作一个通讯录。除了一个给我带来问题的功能之外,我几乎做了所有事情。
我的记录是:
-record(contact, {fname, lname, phone=[], mail=[], city=[], street=[]}).
我必须编写一个函数来搜索 contact 的实例并找到具有特定 city 名称的所有实例,并为这些实例返回 {fname,lname} 元组。不同的联系人当然可以拥有相同的城市。
当我需要 mail 和 phone 字段的类似功能时,我是这样做的:
findByPhone(_,[]) -> {error,"not found"};
findByPhone(Phone,[H|T]) ->
case findPhoneForUser(Phone, H#contact.phone) of
true -> {H#contact.fname, H#contact.lname};
false -> findByPhone(Phone, T)
end.
findPhoneForUser(_,[]) -> false;
findPhoneForUser(Phone, [Phone|_]) -> true;
findPhoneForUser(Phone, [_|T]) -> findPhoneForUser(Phone, T).
但是mail 和phone 都是唯一值,所以只要找到一个,函数就完成了。对于city,一次搜索可以产生多个返回值,因此它必须收集所有匹配项。
如何处理这个问题?我考虑过类似的列表推导:
{X,Y} || X<-H#contact.fname, Y<-H#contact.lname, City=:=H#contact.city
但它会从单个 ASCII 码返回元组:/
【问题讨论】:
标签: erlang list-comprehension record