IsString [Char] instance

Herbert Valerio Riedel hvr at
Mon May 18 10:27:43 UTC 2015

On 2015-05-18 at 11:29:25 +0200, Simon Peyton Jones wrote:
> Have you tested this?  If GHC sees two overlapping instances
>                instance ... => IsString [a]
>                instance IsString [Char]
> it’ll refrain from using the former until it knows that the latter
>                can’t match.

FWIW, the original stated problem of having GHC be able to infer

  "hi" ++ "bye"

under the influence of -XOverloadedStrings which would cause GHC to

  λ:2> "foo" ++ "bar"
      Non type-variable argument in the constraint: Data.String.IsString [a]
      (Use FlexibleContexts to permit this)
      When checking that ‘it’ has the inferred type
        it :: forall a. Data.String.IsString [a] => [a]

is actually resolved by the following patch (which I tried w/ GHC HEAD):

--8<---------------cut here---------------start------------->8---
diff --git a/libraries/base/Data/String.hs b/libraries/base/Data/String.hs
index a03569f..2bed477 100644
--- a/libraries/base/Data/String.hs
+++ b/libraries/base/Data/String.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE NoImplicitPrelude, FlexibleInstances #-}
+{-# LANGUAGE NoImplicitPrelude, GADTs #-}
 -- |
@@ -34,6 +34,6 @@ import Data.List (lines, words, unlines, unwords)
 class IsString a where
     fromString :: String -> a
-instance IsString [Char] where
+instance (a ~ Char) => IsString [a] where
     fromString xs = xs
--8<---------------cut here---------------end--------------->8---

More information about the Libraries mailing list