Sam Stites

Coerce for constant time newtype lists

October 29, 2016

haskell has a coerce function. It’s pretty cool!

in the haskell wiki, it talks about how newtypes incur no runtime cost, but when you have an array of newtypes, a runtime cost will still happen in order to instantiate the array of newtypes. Basically, a linear operation of noops will occur. This can be avoided by using coerce.

import Data.Monoid
import Data.Coerce

-- Without coerce, a linear cost:
x, y, z :: Sum Int
x = [Sum 1, Sum 7, Sum 10000]

-- which is basically the same as:
y = map Sum [1,7,10000 :: Int]

-- With coerce, it becomes an O(1) operation:
z = coerce [1,7,10000 :: Int]