Erlang list comprehension

2019-03-30 09:32发布

问题:

I'm testing an expression with two inequalities for the condition of a list comprehension. Is there a way to have assignments here and not duplicate that expression? (The following code doesn't work, but I wish it would)

diagnose(Expertise,PatientSymptoms)->

{[CertainDisease||
    {CertainDisease,KnownSymptoms}<-Expertise,
    C=length(PatientSymptoms)-length(PatientSymptoms--KnownSymptoms),
    C>=2,
    C<=5      
 ]}.

回答1:

A way of writing it directly without a fun would be to use a begin ... end block ending with a boolean test:

[ CertainDisease || {CertainDisease,KnownSymptoms} <- Expertise,
                    begin
                        C = length(PatientSymptoms) - length(PatientSymptoms -- KnownSymptoms),
                        C >= 2 andalso C <= 5
                    end ]


回答2:

Define a filter function; this way, it is invoked once per element, eliminating your duplication of calculating C:

Filter = fun({CertainDisease, KnownSymptoms}) ->
    C = length(PatientSymptoms) - length(PatientSymptoms--KnownSymptoms),
    C >= 2 andalso C <= 5       
end

And use it in your list comprehension like so:

[CertainDisease ||
    {CertainDisease,KnownSymptoms} <- Expertise,
    Filter({CertainDisease, KnownSymptoms})      
]