Самый быстрый способ конвертировать между enum и Int в GHC? - PullRequest
0 голосов
/ 05 октября 2019

Я хочу преобразовать перечисление в Int или наоборот, т.е. реализовать двунаправленное отображение между тегом типа суммы и Int. Я пробовал fromEnum, но, кажется, недостаточно быстро, а затем я попытался unsafeCoerce, но он не работает, как ожидалось:

import Data.Time.Clock
import Data.Int
import Unsafe.Coerce
import Control.Monad (replicateM_)

data Color = R | G | B
    deriving (Enum)

main = do
    printT 1 $ (unsafeCoerce R :: Int8)
    printT 1000 $ (unsafeCoerce G :: Int8)
    printT 1000000 $ (unsafeCoerce B :: Int8)
    printT 1000000000 $ (unsafeCoerce R :: Int8)

    printT 1 $ (fromEnum R)
    printT 1000 $ (fromEnum G)
    printT 1000000 $ (fromEnum B)
    printT 1000000000 $ (fromEnum B)

---------- profile tools ------------

printT :: Show a => Int -> a -> IO ()
printT n x = print =<< timeIt n (pure x)

timeIt :: Int -> IO a -> IO a
timeIt n _ | n <= 0 = error "timeIt n | n <= 0"
timeIt n proc = do
    t0 <- getCurrentTime
    replicateM_ (n-1) proc
    x <- proc
    t1 <- getCurrentTime
    putStrLn ("-- Time Used (repeat " ++ show n ++ " times): " ++ show (t1 `diffUTCTime` t0))
    return x

Так какой же самый быстрый способ сделать это?

...