2015-01-18 7 views
1

이 코드를 아주 기본적인 오류입니다 만, 왜 이것이 작동하지 않는지에 대한 내 머리를 얻을 수는 없습니다. 올바른 패턴 일치 구문 [H|Tail]이며 같은 이름이지만 세 가지 기능은 쉼표로 구분됩니다.헤드 불일치

+0

첫 번째'map_function'은 영 (zero) 값의 함수이므로 쉼표가 아닌 점으로 끝나야합니다. erlang에서는 다른 [function] (http://erlang.org/doc/reference_manual/functions.html)입니다. Btw. [코드 : 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은 동일하지만 인수에 대응이 아닌이어야한다. Erlang 세계에서는 두 가지 완전히 다른 기능인 map_functions/0map_functions/2을 의미합니다.

또한 "기본 사례"를 map_functions/2에 처음으로 두었고 (첫 번째 절의 반환 값이 튀어 나와서 두 줄로 나누는 것이 더 일반적이지만, 무엇이든간에) 유의하십시오. 이것은 세 가지 이유입니다 : 명쾌함, 기본 케이스를 먼저 작성하는 습관을 가지기 (실수로 무한 루프를 작성하지 않도록), 매우 자주 이것을 수행하여베이스 케이스를 우연히 마스킹하지 않도록해야합니다. 상위 우선 순위 절의 모든 매개 변수와 일치합니다.

이 주제에 대한 일부 확장 된 논의는 (엘릭서와 얼랑를 해결) 여기에 있습니다 : 이름은 같지만 서로 다른 인수에 대응와 Specify arity using only or except when importing function on Elixir

1

기능은이 점으로 구분되며, 다르다.

번호 : all_loaded 되돌아 제 함수 작성되어야하므로 목록 :

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

결과 목록 개조 써야 형태 {모듈 이름, BeamLocation} 그래서 제 기능 튜플들의 목록은 : 당신은 지능형리스트를 사용하여, 얼랑 라이브러리로 파고 코드, 전체 기능의 더 관용적 양식을 사용하도록해야

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

참고, 쓸 수있다 :

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