関数の構成と部分的に適用される関数の概念を理解するのに問題があります。
実際、私は小さなレイトレーサーを書いていて、正確に理解できないいくつかの実装例があります。これは私が理解していない1つの例です(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
-partが部分的に適用された関数を表す(サブ)関数に興味がありますfoldr
(私が正しい場合)。関数の概念は明確で、表面上の点に可視光源の光を追加したいと考えています。effectivelight
すべての可視光源に対して、マップされた関数があります。私が理解していないのは、関数の最後のパラメーターfoldr
( . map effectivelight ) と関数の完全な構造です。誰かが私に関数 (部分的に) と関数の構造を説明できますか? 関数をより直感的な方法で記述できるのではないでしょうか?