Pattern matching on lazy bytestrings: how does it work?

I noticed today that I can pattern match against lazy bytestrings when using the OverloadedStrings extension: import Data.ByteString.Char8 ()
import Data.ByteString.Lazy.Char8
f :: ByteString -> Bool
f "abc" = True
f _ = False
main = do
print $ f $ fromChunks ["abc"]
print $ f $ fromChunks ["a","bc"]
When I run the above, I get: True
True
Given that pattern matching is based on data constructors, how is it possible that (Chunk "abc Empty) and (Chunk "a" (Chunk "bc" Empty)) match the same pattern? Tom

Surely `fromChunks` is making the both lines in the code snippet the same? Also, in your last sentence I think you've miscalculated the shape of the initial input. Best wishes Stephen

On Fri, Apr 22, 2011 at 11:52:32PM -0700, Tom Brow wrote:
I noticed today that I can pattern match against lazy bytestrings when using the OverloadedStrings extension: [..] Given that pattern matching is based on data constructors, how is it possible that (Chunk "abc Empty) and (Chunk "a" (Chunk "bc" Empty)) match the same pattern?
Tom
According to the haskell report[1] string literals use the overloaded (==)
for pattern matching.
Matching a numeric, character, or string literal pattern k against a
value v succeeds if v == k, where == is overloaded based on the type of
the pattern. The match diverges if this test diverges.
[1]: http://www.haskell.org/onlinereport/exps.html#sect3.17.2
--
Helgi Kristvin Sigurbjarnarson
participants (3)
-
Helgi Kristvin Sigurbjarnarson
-
Stephen Tetley
-
Tom Brow