2013-02-05 2 views
1

누군가가 나를 안내 할 수 있다면 정말 고맙겠습니다. 나는 내가 왜 잘못했는지 이해하고 싶습니다. 왜 그런가요? foldl operation in sml

내 코드입니다 :

fun get_longest xs = foldl((fn (x ,y) => if String.size x >= String.size y then x 
else y),[],xs) 

문자열 목록을 가지고 가장 긴 문자열을 반환해야 내 기능; 목록이 비어 있다면, 그냥 return [].

는하지만이 오류를 받고 있어요 :

Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z * 'Y -> 'Y 
    operand:   (string * string -> string) * int * 'X 
    in expression: 
    foldl ((fn (<pat>,<pat>) => if <exp> then <exp> else <exp>),0,xs) 

uncaught exception Error 
    raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
      ../compiler/TopLevel/interact/evalloop.sml:44.55 
      ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20 

답변

6

foldl의 서명을 살펴 보자

val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b 

당신은 당신의 기능 foo 함수가

fun get_longest xs = foldl foo acc xs 

가 요소에 적용되는 형태와 어큐뮬레이터를 가져야한다고 볼 수 있습니다 및 acc은 초기 누적 기입니다.

힌트 :

  1. get_longest 이후 리턴한다 string은 누적 형 string이 있어야합니다. 당신의 임무는 맞는 문자열을 찾아내는 것입니다. 여기서 원하는 값인 []은 의미가 없습니다.
  2. xsstring list이고 foo 함수는 string * string -> string이어야합니다. 이제 foo을 적절한 익명 기능으로 대체해야합니다.
4

foldl은 카레 기능, 그것은 유형은 ('a * 'b -> 'b) -> 'b -> 'a list -> 'b입니다입니다. 따라서 foldl f s xs이라고해야합니다. 당신은 foldl (f, s, xs)이라고 부릅니다. 이는 튜플을 인수로 사용하여 foldl을 호출하고 foldl은 튜플을 기대하지 않기 때문에 잘못되었습니다. 그랬다면 그 타입은 ('a * 'b -> 'b) * 'b * 'a list -> 'b이 될 것입니다.