SML/NJ - 使用 foldr 的一行长度函数

Dus*_*hak 4 ml sml smlnj fold

我正在尝试创建一个长度函数,类似于 ML 中已经包含的函数。我的限制是它必须在一行上完成并使用 map、foldl 或 foldr。

现在我的代码行如下所示:

val mylength = foldr ( fn(x,y) => 1+y) 0;
Run Code Online (Sandbox Code Playgroud)

我绝不是 ML 的专家,但到目前为止我的推理是这样的:

据我了解,foldr 将从列表中的最后一项开始,将其作为 x 参数传递到我的函数中,并使用 0 作为初始 y 值。然后它应该将 y 值加 1 并基本上忽略 x。理论上,我相信这会给我我的总长度。但是我得到了以下错误:

 stdIn:136.5-136.37 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)
 val mylength = fn : ?.X1 list -> int
Run Code Online (Sandbox Code Playgroud)

我的大问题是弄清楚如何以一种可以接受任何类型列表的方式创建这个函数。

如果有人能就如何解决这个问题提供一些建议,我将不胜感激,也许我还没有完全理解 ML 的编程风格。

Kev*_*son 5

你的功能本质上是正确的。根据您使用的解释器,它会接受或拒绝给定的代码。例如,在CloudML上运行您的代码就可以了。为了避免这个问题,而是将其定义为这样的函数:

fun mylength l = foldr ( fn(x,y) => 1+y) 0 l;

华盛顿大学的 Daniel Grossman 在他的一堂课中解释说,这个错误与可变引用有关。遗憾的是,我记不清他在哪一课中提到了这一点。

同时你可以考虑以下几点: