2016-07-12 1 views
1

나는 비약의 example이 코드 참조 :같은 이름의 함수하지만 함수형 언어에서 다른 인수

defmodule Recursion do 
    def print_multiple_times(msg, n) when n <= 1 do 
    IO.puts msg 
    end 

    def print_multiple_times(msg, n) do 
    IO.puts msg 
    print_multiple_times(msg, n - 1) 
    end 
end 

Recursion.print_multiple_times("Hello!", 3) 

나는 같은 기능은 다른 인수로 두 번 정의 여기 참조, 나는이 기술을 이해하려는 .

오버로드 된 함수에서 볼 수 있습니까?

다른 동작을하는 단일 함수 또는 print_only_onceprint_multiple_times과 같은 두 가지 다른 함수입니까?

이러한 기능은 어떻게 든 연결되어 있습니까?

+1

정말 * 패턴 일치 * 및 보호 절에 대한 내용입니다. 인수에 가장 잘 맞는 * 함수 구현 *이 선택됩니다. 여기에는'when' 가드 절의 평가가 포함됩니다. 그것은 동일한 기능이며, 단지 여러 구현을 가지고 있습니다. – deceze

+2

함수가 다른 서명을 가지고 있지만 괜찮습니다. 그러나 서명이 같을 때는 다른 액세스 (def 또는 defp)가 허용되지 않습니다. – PatNowak

답변

4

일반적으로 함수형 언어에서는 함수가 절에 의해 정의됩니다.

defmodule Test do 
    def fibonacci(0), do: 1 
    def fibonacci(1), do: 1 
    def fibonacci(n) when n > 1 do 
    fibonacci(n-1) + fibonacci(n - 2) 
    end 
    def fibonacci(_), do: nil 
end 

:

def fibonacci(n): 
    if n < 0: 
    return None 
    if n == 0 or n == 1: 
    return 1 
    else: 
    return fibonacci(n - 1) + fibonacci(n - 2) 

는 다음을 수행 할 엘릭서에서 함수를 정의하려면 : 예를 들어, 필수 언어 피보나치을 구현하는 한 가지 방법은 다음 코드 (안 최선의 구현)이 될 것입니다 Test.fibonacci/1은 하나의 기능입니다. 수 수가 제 절 하나와 일치 1.

  • 때만 0
  • 두번째 절 일치 때만 네 절과 1

    • 제 절 arity에있는 함수 일치
    • 마지막 절은 변수의 값이 절에서 사용되지 않거나 일치 항목과 관련이 없을 때 사용됩니다 (_). 처음 2 개 조항에 실패하고 2 > 1 때문에 세 번째 일치합니다 Test.fibonacci(2)에 대한 있도록

    조항은,이 선언되고있는 순서대로 평가됩니다.

    절을 더 강력한 if 문으로 생각하십시오. 코드는 이런 식으로 깨끗해 보입니다. 그리고 재귀에 매우 유용합니다. 예를 들어,지도의 구현 (언어는 이미 Enum.map/2 하나를 제공) :

    defmodule Test do 
        def map([], _), do: [] 
        def map([x | xs], f) when is_function(f) do 
        [f.(x) | map(xs, f)] 
        end 
    end 
    
    • 첫 번째 절은 비어있는 목록과 일치합니다. 기능을 적용 할 필요가 없습니다.
    • 두 번째 절은 첫 번째 요소 (머리)가 x이고 나머지 목록 (꼬리)이 xs이고 f이 함수 인 목록과 일치합니다. 이 함수는 첫 번째 요소에 함수를 적용하고 나머지 목록과 함께 재귀 적으로 map을 호출합니다.

    Test.map([1,2,3], fn x -> x * 2 end)를 호출하면 당신에게 다음과 같은 출력 [2, 4, 6]

    그래서, 엘릭서의 기능은 모든 절은 나머지와 같은 인수에 대응이 하나 개 이상의 조항으로 정의를 제공 할 것입니다.

    이 질문에 대한 답변을 보내주십시오.

  • +1

    작은 주석 : "보통 함수 언어에서는 함수가 절에 의해 정의됩니다." 이것은 Haskell과 Standard ML에서는 사실이지만 OCaml이나 Scheme에서는 그렇지 않습니다. – FPstudent

    1

    예를 들어 게시 한 예제에서 함수의 두 정의에 같은 수의 인수가 있습니다.이 "when"이 가드이지만 많은 인수가있는 정의를 가질 수도 있습니다. - 첫째, 경비원들은 다음의 두 번째 줄처럼 단순한 일치로 기록 될 수없는 것을 표현하기 위해 사용됩니다

    def fac(0), do: 1 
    def fac(n), when n<0 do: "no factorial for negative numbers!" 
    def fac(n), do: n*fac(n-1) 
    

    는 - 그냥 평등/매칭에 의해 존재 음수를 표현하는 것은 불가능하기 때문에 .

    btw이 fac은 세 가지 경우에만 있습니다. 도에 아주 가까이 보인다

    def fac(n) do 
        if n==0, do: 1, else: if n<0, do: "no factorial!", else: n*fac(n-1) 
    end 
    

    또는 스위치 케이스 (: 당신은이 좋네요 작성하는 방법이 될 것으로 생각할 수 있습니다 인수 : 의 위치에서 일정 "0"사용의 차가움을 주목하라 위) :

    def fa(n) do 
        case n do 
        0 -> 1 
        n when n>0 -> n*fa(n-1) 
        _ -> "no no no" 
        end 
    end 
    

    "외모가 더 생겼습니다." 사실, 특정 정의 (예 : 파서, 작은 통역사)가 후자의 스타일보다 훨씬 잘 보입니다. Nb 가드 표현은 매우 제한적입니다. (저는 여러분이 자신의 함수를 사용할 수 없다고 생각합니다).

    이제 진짜, 다양한 수의 인수가 - 이것을 확인하십시오!

    def mutant(a), do: a*a 
    def mutant(a,b), do: a*b 
    def mutant(a,b,c), do: mutant(a,b)+mutant(c) 
    

    iex(1)> Lol.mutant(2) 
    4 
    iex(2)> Lol.mutant(2,3) 
    6 
    iex(3)> Lol.mutant(2,3,4) 
    22 
    

    그것은 계획처럼 유사한 조금 (람다 인수 ...) 작품 - 위에 목록과 일치하는 모든 인수를 복용 등의 돌연변이 생각합니다. 그러나 /,/2 돌연변이 돌연변이/3 돌연변이와 같은 그들에게 참조 할 3 개 기능이 때, 불로 불사의 영약 취급이 돌연변이.

    질문에 대답하기 위해 다음은 오버로드 된 함수가 아니라 흩어져있는/조각난 정의입니다. 당신은 miranda, haskell, sml과 같은 기능적 언어로 비슷한 것들을 보았습니다.

    관련 문제