Erlang сопоставление с образцом не является хорошим подходом к решению этой проблемы из-за большого разнообразия представлений чисел, которые должны быть обработаны. Вам лучше попробовать преобразование строки в число , а затем использовать защитные элементы для отделения чисел от чисел с плавающей точкой:
float_or_integer(F) when is_float(F) -> float;
float_or_integer(I) when is_integer(I) -> integer;
float_or_integer(L) ->
Number = try list_to_float(L)
catch
error:badarg -> list_to_integer(L)
end,
float_or_integer(Number).
Заменить тела первых двух функций на logi c определите c к проблеме, которую вы решаете.
Если вы передадите аргумент, который не может быть преобразован, вы получите исключение badarg
, которое вполне уместно.