【问题标题】:SML - operator and operand disagreeSML - 运算符和操作数不一致
【发布时间】:2011-05-27 22:25:23
【问题描述】:

我有这个简单的功能:

val CLC_seq=
       fn (n) =>
       (Cons (n, find_CLC_seq(COL_seq(n))))

时间:

find_CLC_sqe is : int seq -> int;
COL_seq is: fn: int -> int seq;

编译器写道:

Error: operator and operand don't agree
operator domain: int * (Unit -> int seq)
operand: int * int
in expression: 
 (Cons (n, find_CLC_seq(COL_seq(n))))

是什么原因?我该如何解决?谢谢。

【问题讨论】:

    标签: sml


    【解决方案1】:

    嗯,目前尚不清楚您到底要做什么,但是编译器可以正确地接您。 find_CLC_seq 返回一个int,这意味着您的Cons 正试图将int 转换为int。这没有任何意义,因为 cons 用于将元素添加到列表的前面(您的 Cons 函数期望将 int 放在惰性序列的前面,即 (Unit -> int seq))。

    我不知道 CLC 和 COL 是什么,但看起来都像:

    您对CLC_seq 的定义是错误的,因为如果find_CLC_seq 真的要返回int,那么这样使用它是没有意义的;

    或者你对find_CLC_seq的定义是错误的,它的返回类型应该是int seq或者一个惰性序列,顾名思义。在这种情况下,错误在于您没有向我们展示的一些代码。

    【讨论】:

    • 非常感谢,但我还是不明白是什么问题。 find_CLC_seq 返回一个 int(正如我所写:find_CLC_sqe 是:int seq -> int;)。所以它会做Cons(int,int)。为什么编译器将其视为 Unit -> int seq?
    • 是的,您的代码正试图将 int 转换为 int(这就是它说“操作数:int * int”时的意思)。 Cons 构造函数不需要这些参数;它旨在用于将 int 转换为序列。 Cons 的类型将是int * (Unit -> int seq) -> (Unit -> int seq),这就是它说“运营商域”的输入时的意思。 “操作数”是您尝试传递的内容,“运算符域”是您应该传递的内容。
    • find_CLC_seq 是你自己写的吗?如果是这样,您是否打算返回一个 int?我可以看到它确实如此,但这是你想要的吗?从函数的名字看,应该是返回了一个序列,这种情况下错误可能就存在了。
    • find_CLC_seq 返回一个整数!编译器写信给我“find_CLC_sqe 是:int seq -> int;”。 find_CLC_sqe 正在返回序列中出现的第一个数字 5 的位置。
    • 在它之前,我定义了:datatype 'a seq = Nil | 'a * (unit -> 'a seq); 的缺点。也许这就是问题所在?为什么编译器不能做 int*int 的缺点?
    猜你喜欢
    • 2020-05-19
    • 2018-04-28
    • 2018-02-11
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2021-05-17
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多