在sml中进行foldl操作

时间:2013-02-05 21:32:38

标签: 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

foldl是一个curried函数,它的类型是('a * 'b -> 'b) -> 'b -> 'a list -> 'b。因此,它应该被称为foldl f s xs。您将其称为foldl (f, s, xs)。这是错误的,因为它以元组作为参数调用foldlfoldl不期望元组。如果是,则其类型为('a * 'b -> 'b) * 'b * 'a list -> 'b