如何使用 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
希望你做得好兄弟,这也是我目前的作业:))
我是 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
希望你做得好兄弟,这也是我目前的作业:))