1

関数のリストと引数を取り、渡された引数を使用して各関数を呼び出し、呼び出しの結果のリストを返す関数を作成するのに問題があります。例: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>)

最後に、私はあきらめて、いくつかの研究を試みました。次の質問を見つけました: 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 エラーメッセージを処理することはできますが、これは私にはあまりにも異質です.

ps: 関数は build(functions, argument) 経由で呼び出すことはできません。2 つの引数のタプルではなく、2 つの引数である必要があります。

4

2 に答える 2

0

簡単な解決策の 1 つは、標準の高階関数マップを使用することです。

fun build functions arg = map (fn f => f arg) functions;
于 2013-03-29T20:48:52.467 に答える