Sml 参数列表中nat_对()和(nat_对())之间的差异

Sml 参数列表中nat_对()和(nat_对())之间的差异,sml,smlnj,Sml,Smlnj,我是SML的初学者,正在编写我的第一个函数 该函数应该生成自然数不包含零的成对流 此函数使用带谓词的筛选器删除其成员之一为零的对,会产生语法错误: 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 ope

我是SML的初学者,正在编写我的第一个函数

该函数应该生成自然数不包含零的成对流

此函数使用带谓词的筛选器删除其成员之一为零的对,会产生语法错误:

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\u对周围添加额外的大括号,它也会起作用

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;

注意,空格是不相关的,所以

filters not_zero nat_pairs()

filters not_zero nat_pairs ()
由于应用程序关联到左侧,因此将括号括起来

((filters not_zero) nat_pairs) ()

所以,
()
过滤器的第三个参数,而不是
nat\u对的第三个参数。好吧,为了完全理解,为什么我不能使用
过滤器(不是零,nat\u对())
?这还可以清楚地表明not_zero和nat_pairs()都是参数过滤器(p,CONS(x,r))=…
然后
过滤器
具有不同的类型,即形状
x*Y->Z
中的一种,而不是
x->Y->Z
。前者称为元组形式,后者称为“咖喱”形式。无论您使用什么学习材料,都可能在某个时候讨论这些形式。