List Haskell,从列表元组中提取两个列表
我正在使用2个辅助函数进行“合并排序”。第一个helper函数将列表拆分为一个列表元组,在单独的列表中放置奇数和偶数索引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两次,以获得与第一次剥离相同的信息,但我没有进行足够的递归(每个列表只是一个单例,然
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) = ...