作为枚举集合的更大问题的一部分,我需要编写一个OCaml函数'choose',它接受一个列表并输出作为由该列表的元素组成的所有可能的大小为k的序列的列表(不重复序列,可以通过排列获得彼此).它们放在结束列表中的顺序无关紧要.
例如,
choose 2 [1;2;3;4] = [[1;2];[1;3];[1;4];[2;3];[2;4];[3;4]]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想让整个事情变得懒惰,输出一个懒惰的列表,但是如果你有一个严格的解决方案,那也将非常有用.
ocaml functional-programming lazy-evaluation list-manipulation
我想知道如何在Haskell中编写一个将列表列表交织到单个列表中的函数,例如,如果我有一个函数调用
interleavelists :: [[a]] -> [a]
它应该能够交错元素.
示例:[[1,2,3] [4,5,6] [7,8]] --> [1,4,7,2,5,8,3,6]
.
列表可以是有限的也可以是无限的...我可以使用foldr
吗?
Data.List
定义
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f b = case f b of
Just (a,new_b) -> a : unfoldr f new_b
Nothing -> []
Run Code Online (Sandbox Code Playgroud)
有许多功能几乎可以使用unfoldr
,但在列表的最后有问题.一个简单的"修复"是
unfoldr' :: (b -> Either (a,b) [a]) -> b -> [a]
unfoldr' f b = case f b of
Left (a, new_b) -> a : unfoldr' f new_b
Right r -> r
Run Code Online (Sandbox Code Playgroud)
这个功能有标准名称吗?它有不错的属性和良好的互动foldr
吗?
给定2个列表,如何生成第3个列表的输出,该列表的元素为L1和L2的交错集合?如果长度不均匀,则应插入零孔.在第二个注释中,我如何反转列表?我是LISP的新手,只是修改现有的代码......我真的很想得到一个很好的解释,而不仅仅是代码.
我只是在学习Haskell,我想制作一个"shuffle"函数,将两个列表混合在一起,直到一个用完为止.所以,shuffle "abc" "defgh"
会回来"adbecfgh"
.或者shuffle "abc" ""
返回"abc"
.
到目前为止,我有:
shuffle xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys)
Run Code Online (Sandbox Code Playgroud)
问题是,它只是在列表中填充最短列表的长度,而不包括较长列表的其余部分.所以shuffle "abc" "defgh"
回报"adbecf"
而不是"adbecfgh"
.
任何人都可以帮我找到更好的方法吗?
我正在学习Haskell,并与之合作List
.
根据HaskellWiki,如果我想将两个列表合并在一起,我会写:
list1 ++ list2
Run Code Online (Sandbox Code Playgroud)
但是,根据这个答案,在大型列表中使用++将是低效的.
从研究开始,我遇到了这个SO页面,但是这个问题需要对输出的具体要求List
.
我尝试了什么:
假设我有两个数字列表(对于这个例子,假设两个列表足够大,使用++
效率低,如SO答案中所述):
oldNumbers = [1,5,14,22,37]
newNumbers = [3,10,17,27,34,69]
allNumbers = oldNumbers:newNumbers
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我试图添加oldNumbers
到头部,newNumbers
意图在之后allNumbers
将其反转(忽略现在没有顺序,这是另一天的练习).
正如您可能猜到的那样,它产生了一个错误
error:
* Non type-variable argument in the constraint: Num [a]
(Use FlexibleContexts to permit this)
* When checking the inferred type
allNumbers :: forall a. (Num a, Num [a]) => [[a]]
Run Code Online (Sandbox Code Playgroud)
因此,正如标题中所述,我将如何有效地合并两个列表?