2016-09-10 4 views
3

현재 OCaml을 배우려고합니다. 그리고 나는이 파이썬 코드에 해당하는 검색 오전 : OCaml에서 함수의 인수로리스트 사용하기

f(*l[:n]) 

은 내가이 동작을 에뮬레이트하는 함수를 작성하려고 거라고 생각하지만, 그것은 작동하지 않습니다. 여기

let rec arg_supply f xs n = 
    if n = 0 then 
     f 
    else 
     match xs with 
     | x :: remainder -> arg_supply (f x) remainder (n - 1);; 

그리고 내가 오류 메시지입니다 : 여기에 코드가 어떤 도움에 감사드립니다

Error: This expression has type 'a but an expression was expected of type 
'b -> 'a 
The type variable 'a occurs inside 'b -> 'a 

, 그것은 내 기능의 작동을 얻을 수있는 방법, 또는 첫 번째를 제공하는 또 다른 방법이 될 리스트의 n 요소를 인수로 함수에 전달합니다.

편집 : n은 함수를 호출하는 데 필요한 인수의 양과 그것 때문에 상수입니다.

편집 :이 역시 작동하지 않습니다.

type ('a, 'r) as_value = ASFunction of ('a -> ('a, 'r) as_value) | ASReturnValue of 'r;; 

let rec _arg_supply f_or_rval xs n = 
    if n = 0 then 
     f_or_rval 
    else 
     match f_or_rval with 
     | ASFunction func -> (
      match xs with 
       | x :: r -> _arg_supply (func x) r (n - 1) 
       | _ -> failwith "too few arguments for f" 
     ) 
     | ASReturnValue out -> out;; 
+0

그럴 수 없습니다. 'arg_supply'의 타입은'n'의 런타임 값에 의존해야합니다. – melpomene

+1

이것은 일반적인 [XY 문제] (http://xyproblem.info/)입니다. 대신 당신이 정말로하고 싶은 것을 설명해 주시겠습니까? – Drup

+0

@Drup'name_of_the_function (List.nth li 0) (List.nth li 1) (List.nth li 2) ...'을 쓰지 않고도 인자가리스트에있는 함수를 호출하고 싶습니다. 그리고 리턴 타입이 ASFunction 일 필요가 있기 때문에 시도한 솔루션이 도움이되지 않는다고 생각합니다. 그러나 나는이 유형에 맞게 함수를 "확장"할 수있었습니다. – CodenameLambda

답변

3

파이썬 기능 fn의 값에 따라, 인수의 서로 다른 번호를 전달하고있다. 이것은 OCaml에서 표현할 수 없습니다. 함수는 정적으로 고정 된 수의 인수를 취합니다 (즉, 소스 코드를 읽음으로써 인수의 수를 알 수 있습니다).

다른 수의 인수를 OCaml 함수에 전달하는 방법은 파이썬 코드 f(l[:n])에 해당하는 목록을 전달하는 것입니다.

는 (그것은 OCaml의 함수는 하나 개의 인자를 말할 것이 더 정확하지만, 이것은 다른 시간에 대한 토론입니다.)

업데이트

n 실제로 일정한 경우의 그것 3의 가정 해 봅시다 . 그럼 당신은 다음과 같이 수행 할 수 있습니다

match l with 
| a :: b :: c :: _ -> f a b c 
| _ -> failwith "too few arguments for f" 

업데이트를 2

여기에 당신이하고 싶은 것을 보는 또 다른 방법이 있습니다. 당신은 함수를 작성하려면,의는 다음과 같이 작동하는, 그것을 apply을 부르 자 :

let apply f xs = 
    . . . 

아이디어는 apply 목록 xs에서 그것을 인수를주는 기능 f를 호출하는 것입니다.

OCaml은 강력한 형식의 언어이므로 fxs에 대한 형식을 제공 할 수 있어야합니다. f의 유형은 무엇입니까? n 인수의 함수가되기를 원합니다. 여기서 n은 길이가 xs입니다. 즉, n은 상수가 아닙니다! OCaml에는 그런 타입이 없습니다. 모든 함수 유형에는 고정 된 수의 매개 변수가 있습니다. f에 대한 OCaml 유형이 없으므로 apply 함수를 작성할 수 없습니다. 함수 apply1, apply2 등을 작성할 수 있습니다. 이 함수들 각각은 다른 타입을가집니다. 서로 다른 함수 f에 대해 올바른 것을 호출해도 상관이 없다면 작동 할 것입니다.

OCaml의 타이핑에 어려움을 겪지 않고 작업 할 수 있도록 문제를 재구성 할 수 있습니다. 나는 강력한 타이핑에 대한 나의 의견을지지한다 : 강력한 타이핑에 익숙해지면 이익을 포기하고 타이핑 지원이 거의 또는 전혀없는 언어로 돌아 가기 란 매우 어렵다.

+0

죄송 합니다만, 노드의 기능은 다음과 같습니다 : let circle_run inputs = FunctionValue (circle_color_at (List.nth inputs 0) 내 질문에 명확하게. n은 f에 필요한 인수의 양과 상수입니다. 그게'[: n]'의 이유입니다. – CodenameLambda

+0

나는 'n'이 실제로 상수라는 것을 의심하는 경향이 있습니다. 그렇지 않으면 f (* l [: 3])와 같은 것을 쓸 것입니다. 그러나 주어진 값 'n'에 대한 코드를 작성하는 것은 어렵지 않습니다. 위의 ** 업데이트 **를 참조하십시오. –

+0

내가 arg_supply_1, arg_supply_2를 만들어야한다는 것을 의미합니다 ... 이것은 실제로 원하는 것이 아닙니다. 내가 그 모든 것을 필요로하지 않는다면 괜찮을 것이다. – CodenameLambda

관련 문제