2015-01-18 8 views
1

У меня есть этот код:Head Несовпадение в простой схеме аргумент сопоставления

-module(info). 
-export([map_functions/0]). 
-author("me"). 



map_functions() -> 
    {Mod,_} = code:all_loaded(), 
    map_functions(Mod,#{}); 
map_functions([H|Tail],A) -> 
    B = H:mod_info(exports), 
    map_functions(Tail,A#{H => B}); 
map_functions([],A) -> A. 

Однако всякий раз, когда я скомпилировать его я получаю несоответствие головки по линии 10, которая является

map_funtions([H|Tail],A) -> 

Я уверен, что это это очень простая ошибка, но я просто не могу понять, почему это не работает. Это правильный синтаксис соответствия шаблону [H|Tail], а три функции с тем же именем, но разные атрибуты разделяются запятыми.

+0

Первая «карта_функция» - это функция нулевой арности, поэтому она должна заканчиваться точкой, а не запятой. В erlang отличается [функция] (http://erlang.org/doc/reference_manual/functions.html). Btw. [code: all_loaded()] (http://erlang.org/doc/man/code.html#all_loaded-0) возвращает список, а не кортеж. –

+0

Возможный дубликат [Что означает ошибка компилятора «несогласование»?] (Http://stackoverflow.com/questions/1802680/what-does-the-head-mismatch-compiler-error-mean) –

ответ

2

Ваше определение функции должно быть

map_functions() -> 
    {Mod,_} = code:all_loaded(), 
    map_functions(Mod, #{}). 

map_functions([], A)  -> A; 
map_functions([H|Tail], A) -> 
    B = H:mod_info(exports), 
    map_functions(Tail, A#{H => B}). 

Имя map_functions это то же самое, но арностью нет. В мире Эрланга это означает, что это две совершенно разные функции: map_functions/0 и map_functions/2.

Кроме того, обратите внимание, что я положил «базовый футляр» сначала в map_functions/2 (и вытащил возвращаемое значение первого предложения - нарушение этого на две строки более распространено, но что бы то ни было). Это по трем причинам: ясность, привычка сначала писать базовый случай (так что вы случайно не пишете бесконечные петли), и очень часто это необходимо сделать, чтобы вы случайно не замаскировали свой базовый случай сопоставляя каждый параметр в предложении с более высоким приоритетом.

Некоторые расширенное обсуждение на эту тему здесь (обращаясь к Elixir и Erlang): Specify arity using only or except when importing function on Elixir

1

Функция с таким же именем, но разными арностью различны, они отделены друг от друга точками.

код: all_loaded возвращает список, так что первая функция должна быть записана:

map_functions() -> 
    Mods = code:all_loaded(), 
    map_functions(Mods, #{}). 

Результирующий список Модификации представляет собой список кортежей вида {ModName, BeamLocation}, так что вторая функция должна быть записана :

map_functions([], A)  -> A; 
map_functions([{ModName,_}|Tail], A) -> 
    B = ModName:module_info(exports), 
    map_functions(Tail, A#{ModName => B}). 

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

map_functions() -> 
    maps:from_list([{X,X:module_info(exports)} || {X,_} <- code:all_loaded()]).