【问题标题】:SML Error: operator and operand don't agree [tycon mismatch]SML 错误:运算符和操作数不一致 [tycon mismatch]
【发布时间】:2018-02-11 02:28:32
【问题描述】:

我是 SML 的新手,不太了解我的问题,但我确信我有错。首先,这是我正在测试的两个简短函数及其描述。

MakeInterval - 采用自然数 r,(也用于 rp)和自然数 t , 并返回区间 [tr,t+r]。

fun MakeInterval(r,rp,t) =
    if r + rp < 0 then []
    else t-r :: MakeInterval(r-1,rp,t);

例如MakeInterval(3,3,10) 将返回 [7,8,9,10,11,12,13]。如果您有摆脱 rp 的建议,请告诉我。这是我能想到的在保持排序顺序的同时跟踪 r 的原始值的唯一方法。

NotDivisible - 接受一个自然数 r、一个自然数列表 ts1 和另一个自然数列表 ts2时间>。尚未编写使用 ts2 的代码。

r 指定区间的下限和上限,(与 MakeInterval 相同),ts1 是要输入 map 带有 MakeInterval 函数。

fun NotDivisible(r, ts1, ts2) = 
    map (fn x => MakeInterval(r,r,x), ts1);

这个函数应该返回一个区间列表。例如。不可分割(3,[10,20,30], [2,4,6]) 将返回(暂时)[[7..13], [17..23], [27..33]]。

完成这项工作后,我将开始处理这些列表,以找出这些区间中的哪些数字不能被 ts2 中的任何数字整除。

但是现在,我的问题在于我拥有的函数定义。 MakeInterval 的定义没有问题,我已经自己测试过了。这是我在尝试定义 NotDivisible 时收到的错误:

stdIn:5.33-5.71 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z -> 'Y
  operand:         (int -> int list) * 'X
  in expression:
    map ((fn x => MakeInterval <exp>),ts1)

我尝试手动指定所有类型,但无济于事。从逻辑上讲,一切对我来说都是有意义的,但显然这里有一个我没有关注的语法问题。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    上面的问题是map的调用,函数被柯里化了

    map : ('a -> 'b) -> 'a list -> 'b list;
    

    所以,括号里的小改动:

    fun NotDivisible(r, ts1, ts2) = map (fn x => MakeInterval(r,r,x)) ts1;
    

    给你:

    val NotDivisible = fn : int * int list * 'a -> int list list
    

    【讨论】:

    • 太棒了!谢谢你。有趣的是,这么小的错误怎么会让我倒退几个小时。
    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多