2013-03-29 104 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; 

它同級的解釋是不能明白這是列表因此...