Skip to content

Instantly share code, notes, and snippets.

@pete-murphy
Last active September 18, 2021 22:59
Show Gist options
  • Select an option

  • Save pete-murphy/46ecd922c6e7dad16ff633a9b56f6ff7 to your computer and use it in GitHub Desktop.

Select an option

Save pete-murphy/46ecd922c6e7dad16ff633a9b56f6ff7 to your computer and use it in GitHub Desktop.
alaF and foldMap
module Main where
import Prelude
import Data.Foldable (foldMap, sum)
import Data.List (List)
import Data.List.Lazy (replicate, toUnfoldable)
import Data.Monoid.Additive (Additive(..))
import Data.Newtype (alaF)
import Data.Rational (Ratio, (%))
import Data.Tuple (Tuple(..), uncurry)
import Effect (Effect)
import Effect.Class.Console as Console
newtype RatioInt = RatioInt (Ratio Int)
derive newtype instance Semiring RatioInt
derive newtype instance Show RatioInt
foldTuples :: List (Tuple Int Int) -> RatioInt
foldTuples = foldMap `alaF Additive` (RatioInt <<< uncurry (%))
foldTuples' :: List (Tuple Int Int) -> RatioInt
foldTuples' = sum <<< map (RatioInt <<< uncurry (%))
main :: Effect Unit
main = do
let
tuples = toUnfoldable (replicate 1_000_000 (Tuple 1 2))
Console.time "a"
Console.logShow (foldTuples tuples)
Console.timeEnd "a"
Console.time "b"
Console.logShow (foldTuples' tuples)
Console.timeEnd "b"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment