如何使用 mozart oz 中的标签从 pair/tuple 中获取元素?

How to work with labels in mozart oz to get the elements from pair/tuple?

我是 mozart oz 的新手,我有这个问题要解决:

  a) Implement a function Zip that takes a pair Xs#Ys of two lists Xs and Ys (of the
 same length) and returns a pairlist, where the first field of each pair is taken
 from Xs and the second from Ys. For example, {Zip [a b c]#[1 2 3]} returns the
 pairlist [a#1 b#2 c#3].

  b) The function UnZip does the inverse, for example {UnZip [a#1 b#2 c#3]}
 returns [a b c]#[1 2 3]. Give a specification and implementation of UnZip.

我所知道的是 # 是某种由 pair/tuple 组成的标签,取自文档,但我找不到说明如何使用它的示例.

我的问题是如何拆分它以获得项目或如何使用该标签(或任何可能有如何使用它的示例的来源)。

我做了一些搜索,找到了这段代码(我不知道它在语法上是否正确):


    declare
    fun {Zip L}
       case L of nil then nil
       [] L1#L2 then .... % Here i'm stuck or i don't know how to proceed
       end
    end

    {Browse {Zip ['a' 'b' 'c']#[1 2 3]}}

我们将不胜感激。

感谢您的宝贵时间。

基本上,Oz 中的模式匹配是最强大的工具之一。我们不能使用 for 循环,因为变量是不可变的,所以我们使用递归。

functor
import
    System
    Application
define
    fun {Zip L}
      case L of L1#L2 then
        case L1 of H1|R1 then
          case L2 of H2|R2 then
            H1#H2|{Zip R1#R2}
          else nil end
        else nil end
      else nil end
    end
    {System.show {Zip ['a' 'b' 'c']#[1 2 3]}} 

    % Shows [a#1 b#2 c#3]

    {Application.exit 0}
end

您所需要的只是一个反转列表的函数:

    declare
    fun {ReverseAux L1 L2}
       case L1
       of nil then L2
       [] H|T then {ReverseAux T H|L2}
       end
    end
    
    
    % wrapper for reverse
    
    declare
    fun {Reverse L}
       {ReverseAux L nil}
    end
    
    

那么,你的解压函数可以这样写:

    declare
    fun {UnZipAux L S D}
       case L
       of nil then {Reverse S}#{Reverse D}
       [] X#Y|T then {UnZipAux T X|S Y|D}
       end
    end

    
    % wrapper for UnZip

    declare
    fun {UnZip L}
       {UnZipAux L nil nil}
    end

希望你做得好兄弟,这也是我目前的作业:))