Erlang список понимания - PullRequest
       21

Erlang список понимания

4 голосов
/ 13 апреля 2011

Я тестирую выражение с двумя неравенствами для условия понимания списка. Есть ли способ иметь назначения здесь, а не дублировать это выражение? (Следующий код не работает, но хотелось бы, чтобы это было)

диагностика (экспертиза, PatientSymptoms) ->

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

Ответы [ 2 ]

12 голосов
/ 13 апреля 2011

Способ написания этого напрямую без fun заключается в использовании блока begin ... end, заканчивающегося логическим тестом:

[ CertainDisease || {CertainDisease,KnownSymptoms} <- Expertise,
                    begin
                        C = length(PatientSymptoms) - length(PatientSymptoms -- KnownSymptoms),
                        C >= 2 andalso C <= 5
                    end ]
6 голосов
/ 13 апреля 2011

Определить функцию фильтра;таким образом, он вызывается один раз для каждого элемента, исключая дублирование вычисления C:

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

И используйте его в своем понимании списка следующим образом:

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