相关疑难解决方法(0)

在OCaml中懒惰的"n选择k"

作为枚举集合的更大问题的一部分,我需要编写一个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

8
推荐指数
2
解决办法
2224
查看次数

交换Haskell中的列表列表

我想知道如何在Haskell中编写一个将列表列表交织到单个列表中的函数,例如,如果我有一个函数调用

interleavelists :: [[a]] -> [a]

它应该能够交错元素.

示例:[[1,2,3] [4,5,6] [7,8]] --> [1,4,7,2,5,8,3,6].

列表可以是有限的也可以是无限的...我可以使用foldr吗?

haskell list fold interleave

8
推荐指数
3
解决办法
5048
查看次数

略微概括展开

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吗?

haskell

5
推荐指数
1
解决办法
289
查看次数

如何在LISP中交换2个列表中的元素?

给定2个列表,如何生成第3个列表的输出,该列表的元素为L1和L2的交错集合?如果长度不均匀,则应插入零孔.在第二个注释中,我如何反转列表?我是LISP的新手,只是修改现有的代码......我真的很想得到一个很好的解释,而不仅仅是代码.

common-lisp

4
推荐指数
1
解决办法
3777
查看次数

在Haskell中将两个列表混合在一起

我只是在学习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

3
推荐指数
2
解决办法
276
查看次数

有效地合并两个列表

我正在学习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)

因此,正如标题中所述,我将如何有效地合并两个列表?

merge haskell compiler-errors list

2
推荐指数
1
解决办法
249
查看次数