2

私は SML の初心者で、最初の関数を作成したばかりです。

この関数は、ゼロを含まない自然数のペアのストリームを生成することになっています。

メンバーの 1 つが 0 のペアを削除する述語で filter を使用するこの関数は、構文エラーを作成します。

fun nat_pairs_not_zero ()  =  filters not_zero nat_pairs();

stdIn:56.20-59.1 Error: operator and operand don't agree [tycon mismatch]
  operator domain: (int * int) sequ
  operand:         unit -> (int * int) sequ
  in expression:
    (filters nicht_null) nat_pairs

最初に nat_pairs を実行してその結果を保存し、その結果だけを使用すると、うまくいきます。

fun nat_pairs_not_zero ()  =  let 
                                   val lst = nat_pairs() 
                              in
                                   filters not_null lst 
                              end;

中括弧を追加するnat_pairsと、それも機能します。

fun nat_pairs_not_zero ()  =  filters not_zero (nat_pairs());

と だけを実行する(nat_pairs())nat_pairs()、両方とも同じ出力が得られます。

val x = CONS ((0,0),fn) : (int * int) sequ    

誰かがブレース付きとブレースなしのバージョンの違いを説明できますか?

試すために必要な関数定義

type ’a lazy = unit -> ’a;

fun force (f:’a lazy) = f ();

datatype ’a sequ = NIL 
                 | CONS of ’a * ’a sequ lazy;

fun filters p NIL = NIL
  | filters p (CONS (x,r)) =
       if p x then CONS (x,fn ()=>filters p (force r))
       else filters p (force r);                

fun next_pair (x,0) = CONS ((0,x+1), fn ()=>next_pair((0,x+1)))
  | next_pair (x, y) = CONS ((x+1,y-1), fn ()=>next_pair(x+1,y-1));

fun nat_pairs () = CONS ( (0,0), fn()=>next_pair((0,0)));

fun not_zero (0,b) = false
  | not_zero (a,0) = false
  | not_zero (a,b) = true;
4

1 に答える 1

5

空白は無関係であることに注意してください。

filters not_zero nat_pairs()

と同じです

filters not_zero nat_pairs ()

アプリケーションは左側に関連付けられるため、これは次のように括弧で囲みます。

((filters not_zero) nat_pairs) ()

したがって、は への1 つではなく、()への 3 番目の引数です。filtersnat_pairs

于 2013-05-05T16:27:21.237 に答える