{-# LANGUAGE DataKinds #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}
import Data.Proxy import GHC.TypeLits
data Server (s :: Symbol) = Server
run :: forall s. KnownSymbol s => Server s -> IO () run Server = do let x = symbolVal (Proxy @s) print x
data SomeServer = forall s. KnownSymbol s => SomeServer (Server s)
make :: String -> SomeServer make x = case someSymbolVal x of SomeSymbol (Proxy :: Proxy x) -> SomeServer (Server :: Server x)
main :: IO () main = do case make "hello" of SomeServer server -> run server
Я первый раз вообще сервер пишу, у меня в задании было требование такую функцию реализовать. Я столько документации облазил, чтобы понять как это можно сделать, что у меня уже шок от количества этих расширений, модулей, типов, кайндов и прочего