Long multiplication: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: I personally see the structure more immediately in this (hlint, hindented) layout. (but happy to revert if others dissent))
Line 2,359: Line 2,359:
import Data.Char (digitToInt)
import Data.Char (digitToInt)


digits :: Integer -> [Integer]
longmult :: Integer -> Integer -> Integer
longmult x y = foldl1 ((+) . (10 *)) (polymul (digits x) (digits y))
digits = fmap (fromIntegral . digitToInt) . show

lZZ :: [[Integer]]
lZZ = inits $ repeat 0

table :: (Integer -> Integer -> Integer) -> [Integer] -> [Integer] -> [[Integer]]
table f x = fmap $ flip fmap x . f


polymul :: [Integer] -> [Integer] -> [Integer]
polymul :: [Integer] -> [Integer] -> [Integer]
polymul xs ys = fmap sum (transpose (zipWith (++) lZZ (table (*) xs ys)))
polymul xs ys =
sum <$>
transpose
(zipWith
(++)
(inits $ repeat 0)
((\f x -> fmap $ flip fmap x . f) (*) xs ys))


longmult :: Integer -> Integer -> Integer
digits :: Integer -> [Integer]
digits = fmap (fromIntegral . digitToInt) . show
longmult x y = foldl1 ((+) . (10 *)) (polymul (digits x) (digits y))


main :: IO ()
main :: IO ()