我在理解函数组成和部分应用函数的概念时遇到了问题。
实际上,我正在编写一个小型光线追踪器,并有一些我不完全理解的示例实现。这是一个我不明白的例子(https://github.com/ryanl/haskell-raytracer/blob/master/src/RayTracer.hs):它是检测光线颜色的函数:
srdetectcolour' :: Scene -> Ray -> Maybe (Surface, Scalar) -> Colour
srdetectcolour' scene (Ray rx rv) (Just (s,d)) = zipWith (+) lightadded (surface_colour s)
where lightsvisible :: [Light]
lightsvisible = lightsvisiblefrom intersectpoint scene
lightadded :: Colour
lightadded = (foldr (zipWith (+)) black . map effectivelight) lightsvisible
effectivelight :: Light -> Colour
effectivelight (v,c) = map (round . (*10000.0) . (/ (vector_sum ((intersectpoint - v) * (intersectpoint - v)))) . fromInteger) c
intersectpoint = (rx + (mult d rv))
我对(子)函数感兴趣,lightadded
其中foldr
-part 表示部分应用的函数(当我是对的时候)。函数的概念很明确,就是要把可见光源的光加在曲面上的一点上。对于每个可见光源,都effectivelight
映射了一个函数。我不明白的是foldr
-function 的最后一个参数(.map effectivelight)和函数的完整构造。有人可以向我解释功能(部分)和功能的构造吗?也许人们可以以更直观的方式编写函数?