{-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GHC2021 #-} module Main where data Mode = A | B data Settings (m :: Mode) where SettingsA :: Int -> Settings A SettingsB :: String -> Settings B data State (m :: Mode) where AState :: Double -> State A BState :: Float -> State B makeItHappen :: Settings m -> State m -> State m makeItHappen settings state = let newState = case state of AState x -> case settings of SettingsA i -> AState (x + fromIntegral i) BState x -> case settings of SettingsB i -> BState (x + read i) in newState main :: IO () main = do putStrLn "done."