0

SML 関数を呼び出す際の優先順位の問題と思われるものを取得しています。

fun substitute v new (typevar q) = ...

そして、私は別の関数からこれを呼び出しています:

fun new_type_vars (typevar v) non_gens = 
                   substitute v new_var() (typevar v)

しかし、私はエラーが発生します:

    C:/sml/type_checker.sml:22.48-23.44 エラー: 演算子とオペランドが一致しません [タイコンの不一致]
      オペレーター ドメイン: type_exp
      オペランド: 単位 -> 文字列
      式で:
        (置換 v) new_var

これは、(代わりに v) を呼び出し、その呼び出しの結果を引数 new_var で呼び出そうとしていることを示唆しているようです。

全体に括弧を追加しようとしましたが、それは役に立ちません。引数の周りに括弧を追加する(v new_var...)と、v が new_var の関数アプリケーションであると見なされるようになります。この関数呼び出しで何が起こっているのでしょうか?

4

2 に答える 2

1

さまざまな操作と変数のすべてのタイプを提供しているわけではないため、すべてを理解しているわけではありません。

しかし、あなたが抱えている一般的な問題は、すでにお察しのとおり、SML が左側から関数呼び出し (および変数のバインド) を実行することです。ここに例があります:

fun f a:int b:int c:string = ...

したがって、f は int -> int -> string -> ... 型の関数であり、暗黙的に括弧 fun (((fa:int) b:int) c:int) = ... を追加します。

これは、たとえば次のように使用できることを意味します。

var f2 = f 3;

f2 の型は int -> string -> ... になりました。

于 2009-04-17T06:10:32.083 に答える
1

あなたはおそらく変更したい

substitute v new_var() (typevar v)

substitute v (new_var()) (typevar v)

(ブーッタの答えはその理由を説明しています。)

于 2009-04-17T06:19:31.890 に答える