Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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
Haskell 有没有一种方法可以在不创建嵌套列表的情况下使用chunksOf?_Haskell - Fatal编程技术网

Haskell 有没有一种方法可以在不创建嵌套列表的情况下使用chunksOf?

Haskell 有没有一种方法可以在不创建嵌套列表的情况下使用chunksOf?,haskell,Haskell,我试图使用chunksOf函数将一个函数映射到当前列表中的两个项上,例如 newMerk <- map (\[x, y] -> createNode x y) . chuncksOf 2 $ mrk newMerk创建节点x y)。chuncksOf 2$mrk 假设我们有一个列表[x,y,z,d,f,g,h,s,t,q],我希望这个能解决,所以它看起来像这样。[xy,zd,fg,hs,tq]而不是[[xy],[zd],[fg],[hs],[tq]因为chunksOf能够生成动态

我试图使用chunksOf函数将一个函数映射到当前列表中的两个项上,例如

newMerk <- map (\[x, y] -> createNode x y) . chuncksOf 2 $ mrk
newMerk创建节点x y)。chuncksOf 2$mrk

假设我们有一个列表[x,y,z,d,f,g,h,s,t,q],我希望这个能解决,所以它看起来像这样。[xy,zd,fg,hs,tq]而不是[[xy],[zd],[fg],[hs],[tq]

因为
chunksOf
能够生成动态大小的块(即,块的大小取决于只有在运行时才知道的
Int
参数),它必须返回一个列表。常规元组无法工作,因为Haskell中的元组具有固定的静态长度

对于这个特定问题,您可以使用配对函数而不是
chunksOf

pair :: [a] -> [(a, a)]
pair = liftM2 zip odds evens
其中,
赔率
偶数
分别选取奇数和偶数序数元素。那么你的例子很简单

newMerk <- map (uncurry createNode) (pair mrk)
但这似乎比它的价值要麻烦得多。我甚至不知道如何使用当前GHC中可用的依赖类型的工具实现这样一个函数,我希望编写一个使用
[Tuple n a]
的函数也会是一个头疼的问题。

使用Tuple代替

newMerk <- map (\[x, y] -> createNode x y) . chuncksOf 2 $ mrk
newMerk创建节点x y)。chuncksOf 2$mrk
这是个坏主意,因为
[x,y]
可能无法匹配<如果
mrk
的元素数为奇数,则code>chunksOf最终将吐回一个包含一个元素的列表。因此,您应该尝试将
mrk
作为元组列表

[x,y,z,d,f,g,h,s,t,q]我希望这个能解决问题,所以之后看起来像这样。[xy,zd,fg,hs,tq]而不是[xy],[zd],[fg],[hs],[tq]]


这在一般情况下是没有意义的。如果可以连接列表的元素,可以使用
fmap mconcat
,但我认为这里不是这种情况。相反,在默认情况下,构建包含元组的列表。

对我来说,这听起来像是
createNode
的问题,而不是
chunksOf
的问题。也许你最好遵循通常的建议:包括足够的代码,我们可以重现你的问题——并确保准确地说出问题是什么(例如,使用一个我们可以在ghci中键入的具体列表,而不是像
[x,y,z,d,f,g,h,s,t,q]
这样的示意图列表以及你期望的具体输出)。我同意@DanielWagner。可能您应该修改createNode或创建一个帮助器函数,使其介于列表和createNode函数之间。这取决于您的问题。配对函数为+1。我喜欢它的简单性和有效性,尽管我不知道它的性能。在这里实现的,
pair
肯定不是一个有效的函数。但对于这个例子,它很好地说明了这一点:)
newMerk <- map (\[x, y] -> createNode x y) . chuncksOf 2 $ mrk