2016-12-03 8 views
2

아주 기본적인 비약 질문을 반환하는 경우를 제외하고, 배관 중에 정의되지 이 방법으로 시도 :기능 <p></p> 내가 1 (10) 및 출력이 <p>IO.puts</p>에 처음부터 짝수 합계를, 아마 익명 함수

1..10 
|> Enum.filter(fn (x) -> rem(x, 2) == 0 end) 
|> Enum.sum 
|> IO.puts 

예상대로 작동합니다.

defmodule Test do 
    def is_even(x) do 
    rem(x, 2) == 0 
    end 
end 

1..10 
|> Enum.filter(Test.is_even) 
|> Enum.sum 
|> IO.puts 

을하지만이 나에게 컴파일에 다음과 같은 오류를 제공합니다 : 그런 다음


나는 같은 모듈 내에서 그 함수를 정의하려고 왜 is_even을 찾고

** (UndefinedFunctionError) undefined function: Test.is_even/0 
    Test.is_even() 
    tmp/src.exs:8: (file) 
    (elixir) src/elixir_lexical.erl:17: :elixir_lexical.run/3 
    (elixir) lib/code.ex:316: Code.require_file/2 

/0 (내 의도로) is_even/1을 찾아야 할 때?


이 왜 나는 특히이 일을하기 때문에, 이해가 안 :

defmodule Test do 
    def hello(x) do 
    IO.puts(x) 
    end 
end 

Test.hello("Hello World!") 

작품 완전히 잘.


나는 또한 발견 만이 작동합니다

defmodule Test do 
    def is_even() do 
    fn (x) -> rem(x, 2) == 0 end 
    end 
end 

1..10 
|> Enum.filter(Test.is_even) 
|> Enum.sum 
|> IO.puts 

이 왜 함수로 사용할 함수의 반환을 사용하는 대신 함수 자체를 사용?

함수 내부에서 익명 함수를 반환하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

3

일부 일반 언어와 달리 Elixir (및 Erlang 및 아마도 모든 BEAM 기반 언어)를 사용하면 동일한 이름을 가진 여러 함수를 정의 할 수 있습니다. Elixir는 함수 호출을 당신이 호출 한 것과 동일한 정의를 가진 정의로 시도하고 찾습니다.

아티는 함수가 취하는 인수의 수입니다. 예를 들어, 다음 함수는 인수가 진행되지 않는 경우에도, 이러한 기능

def bar(x) do 
    IO.puts "bar" 
end 

1의 인수에 대응을 갖지만 0

def foo() do 
    IO.puts "foo" 
end 

의 인수에 대응있다. 그것이를 가진 것처럼 당신은 당신이 당신의 체인 함수 Test.is_even 전화를 시도 1.

의 인수에 대응하여 기능 is_even를 정의

defmodule Test do 
    def is_even(x) do 
    rem(x, 2) == 0 
    end 
end 

모듈로

, 당신은 그것을라고 0이어야합니다. 함수가 1 일 것으로 예상된다는 것을 지정하려면 다음 표기 &Test.is_even/1을 사용할 수 있습니다.그래서 예

1..10 
|> Enum.filter(&Test.is_even/1) 
|> Enum.sum 
|> IO.puts 
1
defmodule Test do 
    def is_even(x) do 
    rem(x, 2) == 0 
    end 
end 

1..10 
|> Enum.filter(Test.is_even) 
|> Enum.sum 
|> IO.puts 

|> Enum.filter(Test.is_even) 때문에 어떻게 파이프 연산자 작품 작동하지 않는 라인이 될 것입니다. 파이프 연산자는 Enum.filter/2에 대한 첫 번째 인수로 표현식 결과 (1..10)를 넣지 만 에 있기 때문에 Test.is_even/1에 대한 인수로 지정하지 않습니다.

해당 줄은 쓰기와 같습니다 : Enum.filter 1..10, Test.is_even(), Test.is_even에 대한 인수가 전달되지 않으므로 0-arity 함수를 찾았지만 찾지 못했습니다.

마지막 예제의 is_even/0은 첫 번째 예제와 동일한 익명의 함수를 반환하기 때문에 작동합니다.

+1

가 작동하지 않습니다 무엇을하려고하지만, 실제로 작동하고 싶지 않아 어떻게 이유가 설명된다. –

+0

나는 첫 번째 질문에 대답했다. –

1

네가하고 싶은 일이 가능하고 쉽습니다. 가능한 한 엘 릭셔의 다른 값처럼 함수를 전달하려고합니다. 예를 들면 :는

f = &IO.puts/1 

이것은 다른 값처럼 사용할 수있는 가변 fIO.puts/1 할당한다. 이와 같은 함수를 참조 할 때마다 함수의 인수가 포함되어야합니다. 함수의 인수가 하나이므로 인수가 1입니다. 함수를 호출 할 때 많은 인수를 전달하기 때문에 인수가 암시 적이지만,이 방법으로 함수를 참조 할 때는 수동으로 인수를 지정해야합니다. is_even 함수의 버전이 서로 다를 수 있고 VM이 ' 네가 원하는 걸 알아.

당신의 코드는 다음과 같아야합니다

defmodule Test do 
    def is_even(x) do 
    rem(x, 2) == 0 
    end 
end 

1..10 
|> Enum.filter(&Test.is_even/1) 
|> Enum.sum 
|> IO.puts 
관련 문제