It is mostly because those libraries are far older than Text and ByteString, so String was the only choice at the time. Modernizing them is good.. but would also break a lot of code. And in many core libraries, the functions are required to have String types in order to be Haskell 98 compliant. <br>
<br>So, modernization is good. But also requires significant effort, and someone willing to make that effort.<div><br></div><div>Also, URIs are not defined in terms of octets.. but in terms of characters. If you write a URI down on a piece of paper -- what octets are you using? None.. it&#39;s some scribbles on a paper. It is the characters that are important, not the bit representation. If you render a URI in a utf-8 encoded document versus a utf-16 encoded document.. the octets will be different, but the meaning will be the same. Because it is the characters that are important. For a URI Text would be a more compact representation than String.. but ByteString is a bit dodgy since it is not well defined what those bytes represent. (though if you use a newtype wrapper around ByteString to declare that it is Ascii, then that would be fine).</div>
<div><br></div><div>- jeremy<br><br><div class="gmail_quote">On Sat, Mar 10, 2012 at 9:24 PM, Jason Dusek <span dir="ltr">&lt;<a href="mailto:jason.dusek@gmail.com">jason.dusek@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The content of URIs is defined in terms of octets in the RFC,<br>
and all Posix interfaces are byte streams and C strings, not<br>
character strings. Yet in Haskell, we find these objects exposed<br>
with String interfaces:<br>
<br>
&gt; :info Network.URI.URI<br>
data URI<br>
  = URI {uriScheme :: String,<br>
         uriAuthority :: Maybe URIAuth,<br>
         uriPath :: String,<br>
         uriQuery :: String,<br>
         uriFragment :: String}<br>
        -- Defined in Network.URI<br>
<br>
&gt; :info System.Posix.Env.getEnvironment<br>
System.Posix.Env.getEnvironment :: IO [(String, String)]<br>
        -- Defined in System.Posix.Env<br>
<br>
But there is no law that environment variables must be made of<br>
characters:<br>
<br>
 :; export x=$&#39;\xFF&#39; ; echo -n $x | xxd -p<br>
  ff<br>
 :; locale<br>
  LANG=&quot;en_US.UTF-8&quot;<br>
<br>
That the relationship between bytes and characters can be<br>
confusing, both in working with UNIX and in dealing with web<br>
protocols, is undeniable -- but it seems unwise to limit the<br>
options available to Haskell programmers in dealing with these<br>
systems.<br>
<br>
--<br>
Jason Dusek<br>
pgp // solidsnack // C1EBC57DC55144F35460C8DF1FD4C6C1FED18A2B<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div>