2013-04-23 2 views
4

저는 OCaml을 아직 처음 접했고 코드 최적화에 대한 도움을 받고 싶습니다.OCaml 목록 관련 오류

주어진 목록의 각 요소에 목록의 마지막 요소를 곱하려고합니다. 나는이 코드를 실행하면

(* Find the last element of a function *) 
let rec lastE = function 
| [] -> [] 
| [x] -> x 
| _ :: t -> lastE t;; 

(*multiply a list by the last element*) 
let rec lmul list = 
match list with 
[] -> [] 
| hd::tl -> (hd *. (lastE tl)) :: lmul tl;; 

내가이 오류 메시지가 얻을 :

Error: This expression has type float list but 
an expression was expected of type 'a list list 

나는 잠시 동안 공부하고 있어요,하지만에 어떤 도움이 여기에

내 코드의 조각이다 이 문제는 크게 감사 할 것입니다.

+1

lastE에 대한 함수 서명을 보면 '목록 목록을 취하고'대신 '목록'을 반환한다는 것을 알 수 있습니다. 당신이 가진 첫 번째 오류의 원인입니다. List.rev를 사용할 수 있다면 마지막 요소를 매우 쉽게 얻을 수 있습니다. lmul에 대해 List.map을 대신 사용하는 것에 대해 생각해 보았습니까? –

+0

오! List.rev 사용을 생각하지 않았습니다. 그것은 훨씬 더 단순하게 만듭니다. 나는 List.map에 익숙하지 않지만 나는 그 장면을 줄 것이다. –

답변

2

Dave Newman이 말한 것과 다른 말을 바꾸려면 기본 문제는 lastE이 빈 목록을 다르게 처리해야한다는 것입니다. lastE이 숫자를 반환해야하는 경우 모든 경우에 숫자를 반환해야합니다. 그것이 그대로, lastE 빈 목록을 받으면 목록을 반환합니다.

List.map (다시 Dave Newman이 제시 한대로)을 사용하지 않으려면 적어도 목록의 각 요소에 대해 한 번이 아닌 lastE을 한 번만 호출하는 것이 좋습니다. 이것은 긴 목록에 큰 차이를 만듭니다.