[Haskell-cafe] isLetter vs. isAlpha

Artyom Kazak artyom.kazak at gmail.com
Wed Nov 21 22:59:20 CET 2012


I saw a question on StackOverflow about the difference between isAlpha and  
isLetter today. One of the answers stated that the two functions are  
interchangeable, even though they are implemented differently.

I decided to find out whether the difference in implementation influences  
performance, and look what I found:

> import Criterion.Main
> import Data.Char
>fTest name f list = bgroup name $ map (\(n,c) -> bench n $ whnf f c) list
>tests = [("latin", 'e'), ("digit", '8'), ("symbol", '…'), ("greek", 'λ')]
>main = defaultMain [fTest "isAlpha" isAlpha tests, 
>                     fTest "isLetter" isLetter tests]

produces this table (times are in nanoseconds):

                  latin digit symbol greek
                  ----- ----- ------ -----
        isAlpha  | 156   212   368    310
        isLetter | 349   344   383    310

isAlpha is twice as fast on latin inputs! Does it mean that isAlpha should  
be preferred? Why isn’t isLetter defined in terms of isAlpha in Data.Char?

More information about the Haskell-Cafe mailing list