Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell,从列表元组中提取两个列表_List_Haskell_Tuples - Fatal编程技术网

List Haskell,从列表元组中提取两个列表

List Haskell,从列表元组中提取两个列表,list,haskell,tuples,List,Haskell,Tuples,我正在使用2个辅助函数进行“合并排序”。第一个helper函数将列表拆分为一个列表元组,在单独的列表中放置奇数和偶数索引 Example: [1,2,3,4,5,6] Returns: ([1,3,5],[2,4,6]) 第二个helper函数假定列表已排序并合并它们 我将使用这两个函数实现一个未排序列表的合并排序 我有一篇非常低效的文章,基本上是拆分(长度-1)*2次,合并列表(长度-1)次 我调用split两次,以获得与第一次剥离相同的信息,但我没有进行足够的递归(每个列表只是一个单例,然

我正在使用2个辅助函数进行“合并排序”。第一个helper函数将列表拆分为一个列表元组,在单独的列表中放置奇数和偶数索引

Example: [1,2,3,4,5,6]
Returns: ([1,3,5],[2,4,6])
第二个helper函数假定列表已排序并合并它们

我将使用这两个函数实现一个未排序列表的合并排序

我有一篇非常低效的文章,基本上是拆分(长度-1)*2次,合并列表(长度-1)次

我调用split两次,以获得与第一次剥离相同的信息,但我没有进行足够的递归(每个列表只是一个单例,然后将它们全部合并)

如何递归到singleton情况并同时提取元组的两个元素

提前感谢您提供的任何帮助。

您可以使用将
合并
转换为非通用函数,并将
拆分(z:zs)
作为参数传递:

sort (length - 1) $ uncurry merge $ split (z:zs)
uncurry
函数将
a->b->c类型的函数转换为
(a,b)->c类型的函数。在您的案例中,
merge
具有类型
[a]->[a]->[a]
,而
uncurry merge
具有类型
([a],[a])->[a]
,并且
([a],[a])
拆分的返回类型

或者,您可以简单地使用
let
where
子句来引用
拆分的结果:

let (left, right) = split (z:zs)
in sort (length - 1) $ merge left right
这是以下内容的改进版本:

let res = split (z:zs)
in sort (length - 1) $ merge (fst res) (snd res)

请注意,
排序
功能不正确。你的定义是:

sort length (z:zs) = ...
但是,这只匹配非空列表。在不发生.< /P>时,考虑用例<代码>长度=0 < /代码>也是非常无用的。 <>你对<代码>排序> <代码>的定义也要考虑空的情况:

sort _ [] = []
sort length (z:zs) = ...

看看
where
let
构造。使用类似于
where(first,second)=split…
。此外,您还可以使用类似于
all@(x:xs)
的构造将变量绑定到整个列表。
length
参数实现了什么?如果您有不同的问题,请将其作为新问题发布,而不要仅将其添加到现有问题中。哦!谢谢,这很有道理。对不起,我是新来的堆栈溢出。我将来会记住这一点。你真的需要你的长度参数吗?或者你可以用其他方式检测单例情况?我希望有一天这一切对我有意义!现在,谢谢你!当
uncurry
应用于大于2的arity函数时,它的行为是什么?@标准答案是,在Haskell中,每个函数的arity正好是1(1)。所以
c
a->b->c===>(a,b)->c
也可以是
d->e->f->……
一样。@WillNess,是的,我知道,但我对Haskell还是新手,我已经测试过了:
未经修正的f$(1,2)3
-它有效:-)@Mark问这个问题完全可以。:)
sort _ [] = []
sort length (z:zs) = ...