SML中的高阶函数

SML中的高阶函数,sml,ml,higher-order-functions,Sml,Ml,Higher Order Functions,我在编写一个函数时遇到了问题,该函数将接受函数列表和参数,然后使用传递的参数调用每个函数,并返回调用结果列表。 示例:build[f,g,h]2将返回此值,但使用调用的函数和结果而不是调用:[f(2),g(2),h(2)] 顺便说一下,使用SML/NJ 首先,我尝试了这种模式的多种变体: fun build functions TheArgument = if functions = [] then [] else [hd(functions) TheArgument] @ build

我在编写一个函数时遇到了问题,该函数将接受函数列表和参数,然后使用传递的参数调用每个函数,并返回调用结果列表。 示例:
build[f,g,h]2
将返回此值,但使用调用的函数和结果而不是调用:
[f(2),g(2),h(2)]
顺便说一下,使用SML/NJ

首先,我尝试了这种模式的多种变体:

fun build functions TheArgument = if functions = [] then [] else
    [hd(functions) TheArgument] @ build tl(functions) TheArgument;
但它给出了以下错误:

stdIn:2.9-2.36 Error: operator is not a function [equality type required]
  operator: ''Z
  in expression:
    (hd functions) TheArgument
stdIn:1.10-2.70 Error: case object and rules don't agree [tycon mismatch]
  rule domain: ''Z list * 'Y
  object: ('X list -> 'X list) * 'W
  in expression:
    (case (arg,arg)
      of (functions,TheArgument) =>
           if functions = nil then nil else (<exp> :: <exp>) @ <exp> <exp>)
但是,编译器会说:

stdIn:2.14-2.16 Error: infix operator "::" used without "op" in fun dec
stdIn:1.10-2.67 Error: clauses don't all have same number of patterns
stdIn:2.14-2.16 Error: data constructor :: used without argument in pattern
stdIn:1.10-2.67 Error: types of rules don't agree [tycon mismatch]
  earlier rule(s): 'Z list * 'Y -> 'X list
  this rule: ('W -> 'V) * 'U * 'T * 'W -> 'V list
  in rule:
    (f,_,rest,argument) => (f argument :: nil) @ (build rest) argument
我做错了什么

我在这里感到非常困惑,我可以处理神秘的Java/C错误消息,但这对我来说太陌生了


p、 s:无法通过构建(函数、参数)调用函数,它需要两个参数,而不是两个参数的元组。

一个简单的解决方案是使用标准的高阶函数映射:

fun build functions arg = map (fn f => f arg) functions;

一个简单的解决方案是使用标准的高阶函数图:

fun build functions arg = map (fn f => f arg) functions;
上述错误是因为您没有在f::rest之外使用brakets,所以可以按如下方式解决

fun build [] argument = []
|   build (f::rest) argument = [f(argument)] @ build rest argument;
sml解释器无法理解这是一个列表,因此

上述错误是因为您没有在f::rest之外使用brakets,所以可以按如下方式解决

fun build [] argument = []
|   build (f::rest) argument = [f(argument)] @ build rest argument;

sml解释器无法理解这是一个列表,因此…

请注意,不要使用append(@)在列表i类前面添加一个元素,而应该使用cons(::)。在一般情况下,您应该尽可能避免使用append。如果右侧列表很大,由于运行时间过长,这一点尤为重要。在这种情况下,您应该以相反的顺序生成列表,然后在完成后将其反转。在最终版本中,您唯一忘记的是在模式
f::rest
周围加上括号。如果没有这些参数,
构建的第二个等式有四个参数:
f
rest
参数
(而不是第一个等式所示的两个)。而这正是编译器告诉你的(在他的文字上);)请注意,您不应该使用append(@)在list i kind前面添加一个元素,而应该使用cons(::)。在一般情况下,您应该尽可能避免使用append。如果右侧列表很大,由于运行时间过长,这一点尤为重要。在这种情况下,您应该以相反的顺序生成列表,然后在完成后将其反转。在最终版本中,您唯一忘记的是在模式
f::rest
周围加上括号。如果没有这些参数,
构建的第二个等式有四个参数:
f
rest
参数
(而不是第一个等式所示的两个)。而这正是编译器告诉你的(在他的文字上);)@Albertoni顺便说一句,您的原始解决方案似乎是这样工作的:“有趣的构建函数arg=if(null函数),然后[]else([(hd函数)arg]@(build(tl函数)arg));”注意调用hd/tl和检查空列表的区别。在您的特定情况下,错误消息对您的帮助不大。@Albertoni顺便说一句,您的原始解决方案似乎是这样工作的:“fun build functions arg=if(null functions)then[(hd functions)arg]@(build(tl functions)arg));”注意调用hd/tl和检查空列表的区别。在您的特定情况下,错误消息在这里不是很有帮助。