私は 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;