为什么此 SML 函数返回语法错误?

Why is this SML function returning a syntax error?

fun first_answer(my_f:('a -> 'b option)) : 'a list -> 'b =
let
fun help(_a:'a list) : 'a =
(((List.map valOf)o(List.filter isSome)o(List.map my_f)) _a)
in
help
end;

Error: syntax error: replacing WILD with SEMICOLON

_a 搞砸了......错误与 _a

的最后一次使用有关

我并没有走得太远,我已经用很多方法重新安排了逻辑。如您所见,first_answer returns 接受一个函数,returns 接受一个函数。这就是我在这里所做的,据我所知,我正在关注这些类型。可能有些简单的东西我没有看到。

其实很简单:标识符不能以下划线开头。所以 _a 被解析为就好像你写了 _ a,按照通常的 maximal munch 词法语法规则。

编辑:额外提示:您的函数没有 'a list -> 'b 类型,因为 help returns [=16] 的列表=]s,不是 'b 类型的单个值。此外,如所写,它可以更容易地实现为

fun first_answer f xs = List.mapPartial f xs

或者,事实上,

val first_answer = List.mapPartial