• ? code Haskell
    ```
    {-# LANGUAGE ExistentialQuantification #-}
    {-# LANGUAGE RankNTypes #-}
    import Data.Typeable
    import Data.Proxy
    import Data.Void
    import Unsafe.Coerce
    
    data M a = M { mId :: Int, mData :: a}
    
    data F = F (forall s. Typeable s => s -> IO ())
    
    appF :: Typeable s => F -> s -> IO ()
    appF (F f) = f
    
    fPrint x = case cast x of
                 Nothing -> return ()
                 Just i  -> print (i :: Int)
    
    fM x = case splitTyConApp (typeRep (px x)) of
             (tyCon,[t]) | tyCon == tyConM -> print (mId (unsafeCoerce x :: M Void))
             _ -> return ()
      where
        px :: x -> Proxy x
        px _ = Proxy
        (tyConM,_) = splitTyConApp (typeRep (Proxy :: Proxy (M Void)))
    ```
    эту радость как-нить упростить можно? Задача, в том, по значению со Storabe словарём проверить, что это полиморфная штука `M a` и достать оттуда первое поле.

Replies (0)