【问题标题】:list in SML LanguageSML 语言列表
【发布时间】:2020-08-22 20:29:54
【问题描述】:

我是 SML 的新手,我正在尝试从 SML/NJ 的 github 运行一些代码。我目前正在尝试调用该函数

fun dates_in_month(xs : (int * int * int) list, n : int) =
  if null xs then 
    []
  else if #2 (hd xs) = n then 
    (hd xs)::dates_in_month(tl xs, n)
  else
    dates_in_month(tl xs, n)

像这样

dates_in_month(3::2::1::nil, 5)

但我在 SML/NJ 110.97 上收到以下错误消息

stdIn:8.1-8.31 Error: operator and operand do not agree [overload - bad instantiation]
  operator domain: (int * int * int) list * int
  operand:         'Z[INT] list * 'Y[INT]
  in expression:
    dates_in_month (3 :: 2 :: <exp> :: <exp>, 5)

【问题讨论】:

    标签: list sml


    【解决方案1】:

    (int * int * int) list 类型指的是看起来像这样的东西:

    [(1,2,3), (-69,0,69), (10,100,1000)]
    

    你当前传递给函数的是:

    [3,2,1]
    

    这是因为运算符:: 用于构造列表,这些列表与 (1,2,3) 之类的元组不同。 (基本上,list 类型的变量可以是任意长度,而元组是固定长度)。

    【讨论】:

      【解决方案2】:

      出现此问题是因为您当前正尝试使用 int list * int 类型的参数调用 (int * int * int) list * int -&gt; (int * int * int) list 类型的函数。也就是说,您的元组的第一个元素的类型不正确。

      您需要一个包含int 的三元组列表。你可以像这样构建一个:

      (1, 2, 3) :: (4, 5, 6) :: nil
      

      或者更简洁一点

      [(1, 2, 3), (4, 5, 6)]
      

      请注意,这里列表的元素是 int 的三元组,而不是像以前那样只是 ints。

      【讨论】:

        猜你喜欢
        • 2018-06-18
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        相关资源
        最近更新 更多