【问题标题】:Split list of tuples into different partitions in ML在 ML 中将元组列表拆分为不同的分区
【发布时间】:2022-01-24 03:11:33
【问题描述】:

我使用 Python 已经有一段时间了,我想要实现的目标应该是相同的,但我遇到了一个讨厌的错误。

我的问题是我希望将 ML 中的元组列表拆分为单独的变量。

val myList = [(1,2),(3,4)];
val (x :: y) = myList;

在上述语句中,x 将是 (1,2),y 将是 (3,4),... [如果还有的话]。很简单。

现在我想引入第三个变量 z,其中 z 为 (3,4),... 而 x, y 分别为 (1,2)。

val myList = [(1,2),(3,4)];
val ((x :: y) :: z) = myList;

前面sn-p产生的错误是:

error: Pattern and expression have incompatible types.
Pattern: ((x :: y) :: z) : 'a list list
   Expression: myList : (int * int) list
   Reason: Can't unify 'a list to int * int (Incompatible types)

编辑:根据要求,这是 z 应该实现的目标。

val myList = [(1,2),(3,4)];
val ((x :: y) :: z) = myList;

输出将是: x = 1, y = 2, z = (3,4)

在 Python 中,这将是:

Python 3.9.6 | packaged by conda-forge | (default, Jul 11 2021, 
03:35:11) 
[Clang 11.1.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> (x,y),z = [(1,2),(3,4)]
>>> x
1
>>> y
2
>>> z
(3, 4)

【问题讨论】:

  • 你能解释一下这个Now I want to introduce a third variable z where z would be (3,4),... and x, y would be (1,2) respectfully.吗?
  • 肯定会在一分钟内检查编辑。

标签: list tuples ml


【解决方案1】:

经过进一步调查,:: 并不表示我在 Python 中会使用逗号的地方。在两者之间切换可以解决这个问题:

val ((x :: y) :: z) = myList;

现在变成:

val ((x, y), z) = myList;

【讨论】:

    【解决方案2】:

    你的第一个 sn-p 没有做你认为它做的事情:

    val myList = [(1, 2), (3, 4)];
    val (x :: y) = myList;
    

    模式x :: yx 绑定到列表的头部(在本例中为(1, 2)),并将y 绑定到tail of the list(在本例中为[(3, 4)],而不是(3, 4) )。如果要提取前两个元素,请执行以下操作:

    val myList = [(1, 2), (3, 4)];
    val x :: y :: z = myList;
    

    x 将绑定到 (1, 2),尾部将再次进行模式匹配,以便 y 绑定到 (3, 4)z 绑定到空列表 []

    要对一对(2 元组)中的片段进行模式匹配,请使用(x, y)。以下应该可以实现您想要的:

    val myList = [(1, 2), (3, 4)];
    val (x, y) :: z :: _ = myList;
    (* x: 1
     * y: 2
     * z: (3, 4)
     *)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 2017-01-09
      • 1970-01-01
      • 2022-12-21
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多