【问题标题】:SML: Combining Two ListsSML:组合两个列表
【发布时间】:2015-11-08 05:45:12
【问题描述】:

我有以下功能可以将两个列表合二为一。 应该是的类型:

@ : 'a list * 'a list -> 'a list

fun @ (nil, k) = k
    | @ (x::l, k) = x :: @(l,k);

假设我们有两个列表:[1, 2, 3][4, 5, 6]。如果我打电话:

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

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

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

1::2::3::@(nil, [4, 5, 6])

但是在这里我们到达了基本情况,我们的@ 调用返回列表[4, 5, 6],产生:

1::2::3::[4, 5, 6]

这显然不是我想要的。函数定义正确还是我误解了什么?

【问题讨论】:

  • 我不明白这个问题。 为什么 1::2::3::[4, 5, 6] 不是你想要的?如果@ 是一个附加函数,那么这就是正确的结果。你想要什么?
  • 好像你在混淆1::2::3::[4,5,6](只是[1,2,3,4,5,6])和[1,2,3,[4,5,6]]。 SML 的类型系统不允许形成最后一个表达式。

标签: functional-programming sml


【解决方案1】:

是的,您的函数定义是正确的。
::缺点,因为它在 Lisp 中被调用,并且其他函数式编程语言用于创建列表。它接受一个值和一个列表(可能为空)并创建一个新列表,前者附加到后者。因此,例如 42::[17, 23] 等于 [42, 17, 23]
缺点是右关联,这意味着您的列表
1::2::3::[4,5,6]
可以写成
(1::(2::(3::[4,5,6])))
通过连续减少,我们得到
[1,2,3,4,5,6]

【讨论】:

  • Nit: 42::[17, 23] 不等于[42, 17, 23],它 [42, 17, 23],只是写法不同。列表符号只是 :: 的糖。
  • @AndreasRossberg 对于所有有缺点的语言都是如此,还是您专门指的是 SML?
  • 我知道的所有 FPL 都是如此,包括 SML、OCaml、Haskell(使用 :)。如果不是这种情况,那么:: 将不是构造函数,并且您不能使用它来对列表进行模式匹配,例如。
猜你喜欢
  • 2014-12-18
  • 2013-12-29
  • 2022-07-09
  • 2013-10-12
  • 1970-01-01
  • 2020-02-19
  • 2011-12-07
  • 2017-09-26
相关资源
最近更新 更多