2013-07-09 4 views
0

문자열을 가져 와서 문자열의 일부 유형에 따라 결과를 얻으려는 다른 함수를 호출하고 싶습니다.OCaml : IF 문 내에서 문자열 반환

"이 표현은 형식 문자열을 가지고 있지만 표현이 형 유닛으로 예상되었다"

let convert_string lval value = 
if (String.index value '{' > 0) then 
    Pretty_utils.sfprintf "%s" convert_1 lval value 
else 
    Pretty_utils.sfprintf "%s" convert_2 lval value 

그러나,이 코드는 컴파일러 오류가 발생합니다 :처럼 내 코드 보인다.

누구든지이 문제에 익숙합니까?

답변

3

당신은 가이드 convert_1 lval value

let convert_string lval value = 
    if (String.index value '{' > 0) then 
    Pretty_utils.sfprintf "%s" (convert_1 lval value) 
    else 
    Pretty_utils.sfprintf "%s" (convert_2 lval value) 
3

"% s"형식은 하나의 인수 만 사용하고 3을 입력했습니다. convert_1과 convert_2가 lval을 인쇄하기위한 함수 인 경우 "% a % s"( )를 사용하려했을 것입니다.

let convert_string lval value = 
    if (String.index value '{' > 0) then 
     Pretty_utils.sfprintf "%a %s" convert_1 lval value 
    else 
     Pretty_utils.sfprintf "%a %s" convert_2 lval value 
+0

덕분에 모든 ()이 필요합니다. 이제 작동합니다. 그러나 런타임에 Not_found 오류가 발생합니다. 나는 try ..를 Not_found와 함께 사용했다. 그런 다음 작동하지만 두 가지 경우 만 처리 할 수있다. 2 건 이상을 처리하고 싶습니다. if.. then else if then then else 어떻게해야합니까? – user2544482

+0

코드에 '{'가 없으면 Not_found가 있습니다. 당신은 다른 케이스를'with Not_found -> .... 예외 핸들러에 넣어야 만한다. (어떤 ocaml 코드도 사용할 수있다.) –

+0

거기에 문자열을 파싱하는 것 같다. ocamlyacc/ocamllex 또는 regex 나 stream parser 또는 camlp4 파서와 같이 더 전문화 된 도구를 사용하는 것이 더 좋지만, 다른 질문 (아마도 이미 어딘가에 물어 보았을 것입니다)의 주제입니다. –

3

당신은 함수 (convert_x) 및 인수를 분리하거나 OCaml로는 sprintf를 인수로 sprintf와 후 모든 값을 해석합니다.

let convert_string lval value = 
    if (String.index value '{' > 0) then 
    Pretty_utils.sfprintf "%s" (convert_1 lval value) 
    else 
    Pretty_utils.sfprintf "%s" (convert_2 lval value)