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