2012-04-23 1 views
-1

이것은 내가 얻는 오류입니다. 이유는 무엇입니까? "오류 : 언 바운드 레코드 필드 레이블 길이" 알 수 있습니까?Ocaml 오류 : 바인딩되지 않은 레코드 필드 레이블 길이

let rastavi str = 
    let sublist = ref [] in 
    let list = ref [] in 
    for i = ((str.length str)1) [down]to 0 do 
    if str.[i] =' ' then (str.[i] :: !sublist) 
    else (list := (!sublist:: !list)) sublist = [] 
    done ;; 

답변

2

문자열의 길이를 얻으려면 OO 표기법을 사용하고 있습니다. OCaml은 기능 표기법을 사용합니다. 그래서 다음과 같습니다

String.length str 

이 좋아되지 않음 :

str.length (* OO notation, not in OCaml *) 

편집 :

사이드 코멘트 :이 솔루션은 매우 문제에 필수적 걸릴 수 있습니다. FP 사고 방식을 배우려고한다면, 재귀 적으로 그리고 불변하게 생각하려고 노력해야합니다. 숙제처럼 보이기 때문에 원하는 기능적인 해결책 일 가능성이 높습니다.

그러나 여기가 원래 코드에서 몇 가지 다른 문제가 있습니다 :

  1. 당신은 그 사이에 아무 것도 서로 옆에 두 개의 표현이있다. 두 가지 일을하고 싶다면 ;으로 구분해야합니다 (단, 이는 필수적인 스타일입니다).

  2. 두 값이 같은지 비교하고 있습니다. 참조에 값을 할당하려면 :=을 사용해야합니다. (다시 명령 적 스타일.)

+0

지금은 또 다른 문제 : 에서 'rastavi STR = 하자, 하위 목록 = REF [] 하자 목록에서 = REF []가, 감사합니다, 하나 해결 for i = ((String.length str) -1) downto 0 do str [i]! = ""then str [i] ::! sublist) else (list : = (sublist ::! 명부)); sublist : = [] done ;; ' 이 표현식에는 유형 단위가 있지만 표현식 유형이 예상됩니다. char list – user1291037

+0

편집을 참조하십시오. 감사합니다, –

+0

그리고 그 오류가 있었기 때문에 나는 터미널에서 C/P 및 그것을 그냥 몇 가지 징후를 지웠다 (이유는 나를 때려). – user1291037