[Haskell-beginners] problems using bytestrings
Daniel Fischer
daniel.is.fischer at web.de
Tue Jan 19 17:11:20 EST 2010
Am Dienstag 19 Januar 2010 22:34:41 schrieb Joe Van Dyk:
>
> Thanks for the response. I was getting confused -- I'm used to
> thinking about a String as being its own type, instead of being an
> array of chars.
Lists are NOT arrays.
If it was not just loose language on your side, learn the distinction.
List indexing (list !! k) is O(min k (length list)), array indexing is
O(1).
An array knows its size (resp. it can easily be calculated from the known
bounds), a list does not. length list is O(length list).
If you're not aware of the differences, sooner rather than later, you'll
get bitten by a gigantic performance bug.
>
> I now have:
>
> anagrams :: [BS.ByteString] -> [[BS.ByteString]]
> anagrams words =
> sorted_anagrams
> where
> sorted_anagrams = sortBy (flip $ comparing length) get_anagrams
> get_anagrams = Map.elems $ foldl' insert_word Map.empty
> words insert_word map word = Map.insertWith' (++) sorted_word [word] map
> sorted_word word = BS.pack . sort . BS.unpack $ word
>
>
> But get this error:
>
> anagram.hs:12:27:
> No instance for (Ord (BS.ByteString -> BS.ByteString))
> arising from a use of `Map.insertWith'' at anagram.hs:12:27-69
> Possible fix:
> add an instance declaration for
> (Ord (BS.ByteString -> BS.ByteString))
> In the expression: Map.insertWith' (++) sorted_word [word] map
> In the definition of `insert_word':
> insert_word map word = Map.insertWith' (++) sorted_word [word]
> map In the definition of `anagrams':
> anagrams words
> = sorted_anagrams
> where
> sorted_anagrams = sortBy (flip $ comparing
> length) get_anagrams
> get_anagrams = Map.elems $ foldl' insert_word
> Map.empty words
> insert_word map word = Map.insertWith' (++)
> sorted_word [word] map
> sorted_word word = BS.pack . sort . BS.unpack $
> word
>
>
> is sorted_word returning a function?
sorted_word *is* a function.
What you want in insert_word is (sorted_word word), i.e.
insert_word map word = Map.insertWith' (++) (sorted_word word) [word] map
Since you forgot to apply sorted_word to the ByteString, it tries to use
the function sorted_word :: ByteString -> ByteString as a key, but it can't
find the
instance Ord (ByteString -> ByteString) where ...
More information about the Beginners
mailing list