在sml中进行foldl操作

kro*_*ynx 1 sml

如果有人能在这里指导我,我真的很感激,我真的很想知道我做错了什么,为什么?

这是我的代码:

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

我的函数应该采用字符串列表并返回最长的字符串; 如果列表为空,只是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
Run Code Online (Sandbox Code Playgroud)

pad*_*pad 6

看看foldl的签名:

val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
Run Code Online (Sandbox Code Playgroud)

您可以看到您的函数应该具有该表单

fun get_longest xs = foldl foo acc xs 
Run Code Online (Sandbox Code Playgroud)

foo函数在哪里应用于元素和累加器,并且acc是初始累加器.

提示:

  1. 由于get_longest返回a string,累加器应该有类型string.你的工作是找到一个合适的字符串来填写.请注意,[]你想要的值没有意义.
  2. xs是一个string list,你的foo函数应该有类型string * string -> string.现在你必须用foo适当的匿名函数替换.