Haskell 有没有一种方法可以在不创建嵌套列表的情况下使用chunksOf?
我试图使用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能够生成动态
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