如果有人能在这里指导我,我会很感激,我真的很想知道我做错了什么,为什么?
这是我的代码:
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
答案 0 :(得分:6)
查看foldl的签名:
val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
您可以看到您的函数应该具有
形式fun get_longest xs = foldl foo acc xs
其中foo
是函数适用于元素和累加器,而acc
是初始累加器。
<强>提示:强>
get_longest
返回string
,因此累加器应具有类型string
。你的工作是找到一个合适的字符串来填写。注意你想要的值[]
没有意义。 xs
是string 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)
。这是错误的,因为它以元组作为参数调用foldl
而foldl
不期望元组。如果是,则其类型为('a * 'b -> 'b) * 'b * 'a list -> 'b
。