1

如果有人可以在这里指导我,我将不胜感激,我真的很想了解我做错了什么以及为什么?

这是我的代码:

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
4

2 回答 2

6

看一下foldl的签名:

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

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

fun get_longest xs = foldl foo acc xs 

其中foo是函数适用于元素和累加器,并且acc是初始累加器。

提示:

  1. 由于get_longest返回 a string,所以累加器应该有 type string。你的工作是找出一个合适的字符串来填充。注意[]你想要的值在这里没有意义。
  2. xs是 a string list,你的foo函数应该有 type string * string -> string。现在您必须用foo适当的匿名函数替换。
于 2013-02-05T21:57:05.297 回答
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.

于 2013-02-05T21:55:52.940 回答