【问题标题】:Difference between nat_pairs() and (nat_pairs()) in parameter list参数列表中 nat_pairs() 和 (nat_pairs()) 的区别
【发布时间】:2023-04-04 09:39:01
【问题描述】:

我是 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_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;

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    注意空格是无关紧要的,所以

    filters not_zero nat_pairs()
    

    一样
    filters not_zero nat_pairs ()
    

    并且由于应用程序关联到左侧,因此括号内为

    ((filters not_zero) nat_pairs) ()
    

    所以,()filters 的第三个参数,而不是 nat_pairs 的第三个参数。

    【讨论】:

    • 好的,完全理解,为什么我不能使用filters(not_zero, nat_pairs())?这也表明 not_zero 和 nat_pairs() 都是参数。
    • 你可以,如果你将它定义为fun filters(p, NIL) = ... | filters(p, CONS(x,r)) = ... 那么filters 有一个不同的类型,即X * Y -> Z 的形状之一而不是X -> Y -> Z。前者称为元组形式,后者称为“咖喱”形式。无论您使用什么学习材料,都可能会在某个时候讨论这些表格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2011-03-30
    • 1970-01-01
    • 2011-10-11
    • 2011-02-12
    相关资源
    最近更新 更多