2013-02-05 80 views
1

如果有人能指導我這裏,我將不勝感激,我真的很想理解我做錯了什麼,爲什麼?sml中的foldl操作

這是我的代碼:

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 

你可以看到你的函數的形式應該爲

fun get_longest xs = foldl foo acc xs 

其中foo是函數應用的元素和蓄能器和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