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)
也许这个?假设关联性,但添加新层很简单
sum . concat . concat :: Num c => [[[c]]] -> c
Run Code Online (Sandbox Code Playgroud)