Hi Everyone, I tried to come up with a solution, but it has plenty of drawbacks. data Tag = Hdf5 | Cbf | Unchecked data A :: Tag -> Type where Ca :: Symbol -> A Unchecked Ch :: A Hdf5 Cb :: A Cbf type family Typestring (a :: A Unchecked) :: Type type instance Typestring (Ca "hdf5") = A Hdf5 type instance Typestring (Ca "cbf") = A Cbf data SUnchecked a where Sh :: SUnchecked (Ca "hdf5") Sc :: SUnchecked (Ca "cbf") This checkValue function is useless, because you need to pass A Unchecked, and constructor (Ca) takes Symbol rather than String, and value of type SUnchecked a. checkValue :: forall (a :: A Unchecked). A Unchecked -> SUnchecked a -> Typestring a checkValue (Ca x) Sh = Ch checkValue (Ca x) Sc = Cb When I tried to run the above code *Main> :t checkValue (Ca (someSymbolVal "hdf5")) <interactive>:1:17: error: • Couldn't match expected type ‘Symbol’ with actual type ‘GHC.TypeLits.SomeSymbol’ • In the first argument of ‘Ca’, namely ‘(someSymbolVal "hdf5")’ In the first argument of ‘checkValue’, namely ‘(Ca (someSymbolVal "hdf5"))’ In the expression: checkValue (Ca (someSymbolVal "hdf5")) What I really want is something like this, but the problem is I can't do pattern matching on symbols, and if I change the data type to String from Symbol then it won't compile . Could some one point me how to solve this problem? checkValue :: forall (a :: A Unchecked). SUnchecked a => A Unchecked -> Typestring a checkValue (Ca "hdf5") = Ch checkValue (Ca "cbf") = Cb Best regards, Mukesh On Thu, Oct 4, 2018 at 11:11 PM Francesco Ariis <fa-ml@ariis.it> wrote:
Hello Nikita,
On Thu, Oct 04, 2018 at 02:50:09AM +0300, Никита Фуфаев wrote:
As this problem requires type to depend on runtime value, you need singletons.
Many thanks for showing us the way, very elegant solution. _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners