我尝试使用chunksOf函数将一个函数一次映射到当前列表中的两个项目上,例如。
newMerk <- map (\[x, y] -> createNode 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]
发布于 2017-09-21 01:10:47
由于chunksOf
能够产生动态大小的块(即,块的大小取决于只有在运行时才知道的Int
参数),它必须返回一个列表。常规元组无法工作,因为Haskell中的元组具有固定的静态长度。
对于这个特定的问题,可以使用配对函数而不是chunksOf
pair :: [a] -> [(a, a)]
pair = liftM2 zip odds evens
其中odds
和evens
分别选取奇数和偶数序数元素。那么你的例子很简单
newMerk <- map (uncurry createNode) (pair mrk)
为了获得额外的乐趣™,您可以尝试按照以下代码编写一个函数:
{-# LANGUAGE DataKinds, TypeFamiles #-}
import Data.Proxy
import GHC.TypeLits
type family Tuple (n :: Nat) a where
Tuple 1 a = a
Tuple 2 a = (a, a)
Tuple 3 a = (a, a, a)
Tuple 4 a = (a, a, a, a)
...
chunksOf :: KnownNat n => Proxy n -> [a] -> [Tuple n a]
chunksOf p xs = ???
但这似乎比它值得的麻烦要多得多。我甚至不确定如何使用当前GHC中提供的依赖类型的工具来实现这样的函数,而且我希望编写一个函数来使用[Tuple n a]
也会令人头疼。
https://stackoverflow.com/questions/46326880
复制相似问题