2013-06-12 1 views
-3

이 로컬 함수가 있습니다. 나는 let ... in으로 작성해야하는데, 다른 경우에는 구문 오류가 발생하기 때문입니다. before뿐 아니라 after도 어떻게 처리 할 수 ​​있습니까? 그냥 전에이 같다고 가정 해 봅시다 :let in (ocaml에서)을 사용하여 재귀 함수를 작성하는 방법

after = "b/drivers/usb/gadget/..../file"` 

내 녹화 기능은 다음과 같습니다 :

before = "a/drivers/usb/gadget/.../file" 

after은 다음과 같습니다

let rec f (before: string list) : string list = 
      begin match Str.split (Str.regexp "/") before with 
         | _ ::rest -> out (String.concat "/" rest) 
         | _ ->() 
       end 
+1

(있는 경우) 질문은 무엇입니까? – Thomash

답변

1

귀하의 질문에 하드 매우이다 이해하지만, 맞다면 : 함수의 본질은 여러 매개 변수를 사용하여 원하는만큼 여러 번 호출 할 수 있다는 것입니다. 여기

let sqdist (x0, y0) (x1, y1) = 
    let sq a = a * a in 
    sq (x1 - x0) + sq (y1 - y0) 

나는 로컬 함수로 sq을 정의한 나는 x1 - x0y1 - y0 모두를 호출하고 있습니다.

업데이트 : 함수는리스트의 모든 요소를 ​​처리하도록되어 같은

지금은 나에게 소리. 실제 생활에서는 List.map을 사용합니다. 재귀를 사용하여 매핑하는 방법은 다음과 같습니다.

let squareEveryInt (list: int list) : int list = 
    let rec go l = 
     match l with 
     | [] -> [] 
     | n :: rest -> n * n :: go rest 
    in 
    go list 

예제 코드와 중요한 차이점이 많이 있습니다. 필자가 누락 된 주된 기능은 함수에 대한 재귀 호출입니다.

+0

예 "let rec"가 로컬입니다! 심지어 레 rec! let rec 대신에 let을 사용해야합니다. – mirou

+1

'rec'의 사용은 전적으로 당신의 함수가 자신을 호출 할 필요가 있는지에 달려 있습니다. 자신을 호출 할 필요가 없다면,'rec'를 가질 필요가 없습니다. 귀하의 예제 코드 자체를 호출하지 않습니다, 그래서 당신은 단지'rec'을 떠날 수있는 용의자. 그러나 이것이'rec'를 지정하는 것을 해치지 않으므로 이것이 당신의 기본적인 문제인지는 의심 스럽습니다. –

+0

문제는 내 exepmle 라인의 첫 번째 요소를 삭제, printf 나머지 부분을 ("/"요소 concatinating 함께), 그래서 그것을 rec 함수라고 생각하므로 내 자신을 호출 할 때마다 그것을 반복해서해라 !! 어쩌면 내가 틀렸어! 그러나 이것은 내가 그것을 보는 방법이다!! 나는 틀린가? – mirou

관련 문제