ghci> :set -XOverloadedStrings
   ghci> "$name ate a banana." % [("name", "Johan")]
   "Johan ate a banana."

   class Context a where
       lookup :: a -> T.Text -> T.Text

   instance Context [(T.Text, T.Text)] where
lookup xs k = fromMaybe (error $ "KeyError: " ++ show k) (P.lookup k xs)

This instance only applies if the pair components are Texts.

With OverloadedStrings, your unannotated String-like Pairs
have variable type components, so the instances neither
matches nor forces the type variables to be Text.

It sounds as if you want an instance that always applies for
lists of pairs, instantiates type variable components to Texts,
and fails if the components cannot be Texts. Untested:

   instance (key~T.Text,value~T.Text) => Context [(key, value)] where

You might also want to parameterize Context over the
type of template, but then you might need to annotate
the template type, or use separate ops for different types
of template?

Claus

   -- > "$foo" % [("foo" :: T.Text, "bar" :: T.Text)]
   (%) :: Context c => T.Text -> c -> LT.Text
   (%) = undefined

The problem is that the compiler is not able to deduce that string
literals should have type 'Text' when used in 'Context's. For example

   ghci> :t "$foo" % [("foo", "bar")]

   <interactive>:1:8:
       No instance for (Context [(a, a1)])
         arising from a use of `%'
       Possible fix: add an instance declaration for (Context [(a, a1)])
       In the expression: "$foo" % [("foo", "bar")]

This forces the user to provide explicit type signatures, which makes
the construct more heavy weight and defeats the whole purpose of
introducing the 'Context' class:

   ghci> :t "$foo" % [("foo" :: T.Text, "bar" :: T.Text)]
   "$foo" % [("foo" :: T.Text, "bar" :: T.Text)] :: LT.Text

Is there any way to make the syntactically short `"$foo" % [("foo",
"bar")]` work but still keep the 'Context' class?

Johan

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe





_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to