【问题标题】:SML: Error: operator and operand don't agree [tycon mismatch]SML:错误:运算符和操作数不一致 [tycon mismatch]
【发布时间】:2016-06-09 21:24:30
【问题描述】:

我正在尝试编写一个有两个参数的 SML 函数,第一个是 int,第二个是列表列表。目标是将第一个参数插入到第二个参数中每个列表的前面。例如,append_to_front(1,[[3,4],[6,8],[]]) 应该返回 [[1,3,4],[1,6,8],[1]]

我有代码:

fun append_to_front(a:int, L:int list list) =
    if L = []
    then []
    else a::hd(L)::append_to_front(a, tl(L));

我收到错误消息:错误:运算符和操作数不同意 [tycon mismatch]。为什么?

【问题讨论】:

  • 你也可以用高阶函数解决这个问题:fun append_to_front (x, L) = map (fn xs => x::xs) L

标签: sml


【解决方案1】:

cons 运算符:: 的类型为'a * 'a list -> 'a list,即它需要左边有一个元素,右边有一个列表。此外,它是右关联的,即a::b::c = a::(b::c)

在您的情况下,a 的类型为 intbc 的类型均为 int list。因此,:: 的第二次使用不是很好的类型,因为它的两边都有一个列表。在那个地方使用列表连接@

【讨论】:

  • 感谢您的提示。我通过在 (a::hd(L)) 中添加括号解决了我的问题。
猜你喜欢
  • 2018-02-11
  • 2018-04-28
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多