【问题标题】:foldl operation in smlsml中的foldl操作
【发布时间】:2013-02-07 04:18:53
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

    标签: sml


    【解决方案1】:

    看看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. xs 是一个string list,你的foo 函数应该有string * string -&gt; string 类型。现在您必须将foo 替换为适当的匿名函数。

    【讨论】:

      【解决方案2】:

      foldl 是一个柯里化函数,它的类型是('a * 'b -&gt; 'b) -&gt; 'b -&gt; 'a list -&gt; 'b。因此它应该被称为foldl f s xs。你称它为foldl (f, s, xs)。这是错误的,因为它调用 foldl 时使用一个元组作为其参数,而 foldl 不期望一个元组。如果是,它的类型将是('a * 'b -&gt; 'b) * 'b * 'a list -&gt; 'b

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2017-01-25
        • 2012-04-01
        • 2013-12-17
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        相关资源
        最近更新 更多