在haskell中的Cubesumming

Mag*_*ist 8 haskell

Haskell具有sum函数

sum :: Num a => [a] -> a
Run Code Online (Sandbox Code Playgroud)

哪个可以很好地组合以对矩阵求和

sum . map sum :: Num a => [[a]] -> a
Run Code Online (Sandbox Code Playgroud)

然而,更深入,例如求和立方体,会产生限制Num [a]

sum . map sum . map sum :: (Num a, Num [a]) => [[[a]]] -> a
Run Code Online (Sandbox Code Playgroud)

如果你考虑一下,这很自然.因此,前者试图定义一个人脸上的sumcube函数,我们需要找到一条不同的路径.其中一种尝试是:

sum . map sum . map (map sum) :: Num a => [[[a]]] -> a
Run Code Online (Sandbox Code Playgroud)

这似乎与汇总函数一样自然.

在我寻求在Haskell中使用解决问题的心理工具的过程中,我有兴趣知道如何解决这个问题,即通过堆叠map sums 来总结任何深度的结构,就像在我的第三个代码示例中一样.这是可能吗?在那种情况下,你会怎么做?

Lan*_*dei 14

类型怎么样?

class Summable a where
  total :: a -> Int

instance Summable Int where
  total = id  

instance Summable x => Summable [x] where
  total = sum . map total  

total ([[[1,2,3],[4,5]],[[6],[7,8,9,10]]] :: [[[Int]]])
--55
Run Code Online (Sandbox Code Playgroud)


Sjo*_*her 12

你必须从内到外工作.当你有一个f求和数据结构的函数时,那sum . map f就是对这些数据结构的列表求和的方法.

                     sum  :: Num a =>   [a]   -> a
           sum . map sum  :: Num a =>  [[a]]  -> a
sum . map (sum . map sum) :: Num a => [[[a]]] -> a
Run Code Online (Sandbox Code Playgroud)


sdc*_*vvc 5

也许这个?假设关联性,但添加新层很简单

 sum . concat . concat :: Num c => [[[c]]] -> c
Run Code Online (Sandbox Code Playgroud)

  • `concat`从类型的外部移除层,而`sum`必须从内部移除层.对比`concat.concat`和`sum.映射sum`与`concat.地图concat` (2认同)