2013-03-29 144 views
0

我在编写一个函数时会遇到麻烦,该函数将获取函数和参数列表,然后使用传递的参数调用每个函数,并返回调用结果列表。 例如:build [f, g, h] 2将返回此,但与调用的功能和结果,而不是调用:[f(2), g(2), h(2)] 顺便说一句,使用SML/NJ。SML中的高阶函数作业

首先我想这种模式的许多变种:

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>) 

最后,我放弃了,并试图做一些研究。我发现以下问题:Higher Order Functions in SML/NJ

我试图重新定义为这样:

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

但随后的编译器吐出这样的:

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 .:该函数不能通过构建(函数,参数)调用,它需要两个参数而不是2个参数的元组。

+1

注意,代替邻f使用append(@)添加列表中的一个元素infront,您应该使用cons(:)来代替。在一般情况下,应尽可能避免使用append。由于未固化的运行时间,如果右侧列表很大,这一点尤其重要。在这种情况下,您应该以相反的顺序生成列表,然后在完成时将其反转。 –

+0

您在最终版本中忘记的唯一事情是将括号放在'f :: rest'模式的周围。如果没有这些,你的第二个'build'方程有四个参数:'f','::','rest','argument'(而不是两个,如第一个方程所示)。这正是编译器告诉你的(用他的话来说);) – chris

回答

0

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

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

谢谢,它工作。我现在觉得自己像个白痴。 – Albertoni

+0

@Albertoni顺便说一下,它看起来像你原来的解决方案会像这样工作:“fun build functions arg = if(null functions)then [] else([(hd functions)arg] @(build(tl functions) ARG));”注意调用hd/tl和检查空列表的差异。这些错误信息在您的特定情况下对此不是很有帮助。 – svk

0
stdIn:2.14-2.16 Error: infix operator "::" used without "op" in fun dec 

这上面的错误是因为你还没有使用˚F::休息之外brakets所以这可以是解析为

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

它同级的解释是不能明白这是列表因此...