2013-02-09 4 views
0

입력 목록의 각 요소에 지정된 조건부에 적용되는 "필터"함수를 작성하여 포함 여부를 확인합니다 출력.필터 조건부 작성 : "표현식 유형이 int ... .. bool 유형이 예상 됨"

let rec filer (pred: 'a -> bool) (l: 'a list) : 'a list = 
begin match l with 
| [] -> [] 
| hd :: rest -> if (pred hd) then hd :: (filter pred rest) else filter pred rest 
end 

이제는 5의 배수를 유지하기 위해 필터에 전달할 수있는 조건부를 작성합니다. 내가 여기에 누락 모르는

let multiples_of_five_pred: int -> bool = 
filter (fun (x: int) -> x mod 5) 

... 난라는 구문 오류 받고 있어요 "이 표현은 int 형했습니다하지만 표현은 bool 형식의 예상되었다."

+0

글쎄, 컴파일러는 무엇을 말하려고합니까? : D –

답변

2

filter에 주어진 함수는 부울을 생성해야하지만 오류 메시지가 알려주므로 filter에주는 함수는 부울이 아닌 정수를 생성합니다. 대신 부울 값을 생성하려면이 값을 변경해야합니다.

일단 수정하면 다른 형식 오류가 발생합니다. 정수를 사용하는 함수에 filter을 적용하면 int list -> int list 유형의 함수가 생성되지만 유형 서명에 따라 int -> bool 유형이 필요합니다.

또한 multiples_of_five_prodfilter-을 부여 수있는 기능이 있어야한다라고 있습니다,하지만 당신은 실제로 함수 내에서 filter를 호출합니다. 그건 맞지 않아. filter으로 전화를 끊어야합니다.

0

문제의 근본 원인은 필요하지 않을 때 유형 주석을 사용하고 있다는 것입니다. 당신이 그들을 놓쳤다면 (필요하지 않다면), 두 번째 함수가 당신이 기대하는 타입을 가지지 않는 이유를 더 빨리 알 수 있습니다.

+2

글쎄, 그는 이미 정확한 문제를 나타내는 메시지를 얻고 있다고 말하고 싶다 :-) 트릭 (아마)은 컴파일러를 믿는 것이다. 나는 타입 어노테이션을 사용하는 것이 반드시 낙심해야한다고 생각하지 않는다. –

+2

문제는 두 번째 함수의 형식이 잘못되었습니다. 유형이 전혀 없습니다. 유형이 잘못되었습니다. 형식 주석을 사용하거나 사용하지 않고 컴파일되지 않습니다. 또한 형식 주석을 제거하는 것이 도움이되는 오류 메시지를 유발하는 경우는 거의 없으며이 경우 오류 메시지가 전혀 변경되지 않습니다. – sepp2k

관련 문제