【问题标题】:SML - Unzip tuples in one listSML - 在一个列表中解压缩元组
【发布时间】:2015-08-24 03:05:26
【问题描述】:

我需要“解压缩”一个元组列表,即使我尝试使用 unzip 函数,它也没有达到我想要的效果。事实上,据我了解,unzip 函数会返回一个列表元组,但我想要的是这个。

给出这样的元组列表:

L1 = [(("s0","l0"),("l0","s1")),(("s1","l1"),("l1","s2"))]

类型:

(string*string)*(string*string) list

该函数应该返回一个由解压缩的元组组成的列表:

L2 = [("s0","l0"),("l0","s1"),("s1","l1"),("l1","s2")]

类型:

(string*string) list

我找到的唯一解决方案是:

fun f(h as (x,y,z),nil) =  [(x,x^y^z)]@[(x^y^z,z)]
|f (h as (x,y,z),t::rest) = 
    let val i = ref 0
        in if !i=0 then (i := !i+1; (x,x^y^z)::f(h,t::rest)) else (i := !i-1;(x^y^z,z)::f(t,rest)) end;

我认为它可以工作,但是当我运行该功能时,系统崩溃了。

【问题讨论】:

    标签: list tuples sml unzip


    【解决方案1】:

    我不完全确定您发布的功能是做什么的,但它几乎肯定不会为您解压缩 2 元组列表。它似乎期望 3 元组,并执行一些取消引用/连接来启动。你是怎么找到的?

    如果你想要一个接受 2 元组列表并返回其元素列表的函数,你可以这样做

    fun peel lst =
        let fun recur [] acc = List.rev acc
          | recur ((a, b)::rest) acc = 
            recur rest (b::a::acc)
        in 
        recur lst []
        end
    

    也就是说,遍历列表,收集每个元组的两个元素,并在到达末尾时返回累加器的倒数。

    Standard ML of New Jersey v110.76 [built: Thu Feb 19 00:37:13 2015]
    - fun peel lst =
        let fun recur [] acc = List.rev acc
          | recur ((a, b)::rest) acc = 
            recur rest (b::a::acc)
        in 
        recur lst []
        end ;;
    = = = = = = [autoloading]
    [library $SMLNJ-BASIS/basis.cm is stable]
    [autoloading done]
    val peel = fn : ('a * 'a) list -> 'a list
    - peel [(("s0","l0"),("l0","s1")),(("s1","l1"),("l1","s2"))] ;;
    val it = [("s0","l0"),("l0","s1"),("s1","l1"),("l1","s2")]
      : (string * string) list
    - 
    

    由于它的定义方式,它具有(可能是不必要的好处)它可以类似地处理任何 2 元组列表。

    - peel (peel [(("s0","l0"),("l0","s1")),(("s1","l1"),("l1","s2"))]) ;;
    val it = ["s0","l0","l0","s1","s1","l1","l1","s2"] : string list
    - 
    

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2014-07-13
      • 2020-12-11
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多