sml中的foldl操作

sml中的foldl操作,sml,Sml,如果有人能在这里指导我,我将不胜感激,我真的想知道我做错了什么,为什么 这是我的代码: fun get_longest xs = foldl((fn (x ,y ) => if String.size x >= String.size y then x else y),[],xs) 我的函数应该获取字符串列表并返回最长的字符串;如果列表为空,只需返回[] 但我得到了一个错误: Error: operator and operand don't agree [tycon misma

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

这是我的代码:

fun get_longest xs = foldl((fn (x ,y ) => if  String.size x >= String.size y then x
else y),[],xs)
我的函数应该获取字符串列表并返回最长的字符串;如果列表为空,只需返回[]

但我得到了一个错误:

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
错误:运算符和操作数不一致[tycon不匹配]
运算符域:“Z*”Y->“Y”
操作数:(字符串*字符串->字符串)*int*'X
在表达上:
foldl((fn(,)=>if-then-else),0,xs)
未捕获异常错误
在以下位置引发:../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

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
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

查看以下签名:

您可以看到,您的函数应该具有以下形式

fun get_longest xs = foldl foo acc xs 
其中,
foo
是应用于元件和累加器的函数,
acc
是初始累加器

提示:

  • 由于
    get_longest
    返回一个
    字符串
    ,因此累加器的类型应为
    字符串
    。你的工作是找出一个合适的字符串来填充。请注意,此处所需的值
    []
    没有意义
  • xs
    是一个
    字符串列表
    ,您的
    foo
    函数应该具有类型
    string*string->string
    。现在,您必须用适当的匿名函数替换
    foo

  • 请看以下签名:

    您可以看到,您的函数应该具有以下形式

    fun get_longest xs = foldl foo acc xs 
    
    其中,
    foo
    是应用于元件和累加器的函数,
    acc
    是初始累加器

    提示:

  • 由于
    get_longest
    返回一个
    字符串
    ,因此累加器的类型应为
    字符串
    。你的工作是找出一个合适的字符串来填充。请注意,此处所需的值
    []
    没有意义
  • xs
    是一个
    字符串列表
    ,您的
    foo
    函数应该具有类型
    string*string->string
    。现在,您必须用适当的匿名函数替换
    foo