RosettaCodeData/Task/Pascal-matrix-generation/Haskell/pascal-matrix-generation-2.hs

46 lines
994 B
Haskell

import Control.Monad (join)
import Data.Bifunctor (bimap)
import Data.Ix (range)
import Data.List.Split (chunksOf)
import Data.Tuple (swap)
---------------------- PASCAL MATRIX ---------------------
pascalMatrix :: ((Int, Int) -> (Int, Int)) -> Int -> [Int]
pascalMatrix f n =
bc . f
<$> range
((0, 0), join bimap pred (n, n))
-- Binomial coefficient
bc :: (Int, Int) -> Int
bc (n, k) =
foldr
(\x a -> quot (a * succ (n - x)) x)
1
[k, pred k .. 1]
--------------------------- TEST -------------------------
matrixSize = 5 :: Int
main :: IO ()
main =
mapM_
putStrLn
( unlines
. ( \(s, xs) ->
s :
(show <$> chunksOf matrixSize xs)
)
<$> zip
["Lower", "Upper", "Symmetric"]
( pascalMatrix
<$> [ id, -- Lower
swap, -- Upper
\(a, b) -> (a + b, b) -- Symmetric
]
<*> [matrixSize]
)
)