練習問題(つづき)

「入門Haskell」のp.31から二つ目。

② 単語のカウント方法として,`Theory of Everything'のようにバッククォートとシングルクォートで囲まれたパートを,1つの単語として表現するように wordsCount を拡張しなさい。

オリジナルの wordsCount。

 wordsCount str = outWords str
     where outWords []        = 0
           outWords (c:cs)
               | isAlphaNum c = 1 + inWords cs
               | otherwise    = outWords cs
           inWords []         = 0
           inWords (c:cs)
               | isAlphaNum c = inWords cs
               | otherwise    = outWords cs

拡張版。

 wordsCount str = outWords str
     where outWords []        = 0
           outWords (c:cs)
               | c == '`'     = 1 + inQuote cs
               | isAlphaNum c = 1 + inWords cs
               | otherwise    = outWords cs
           inWords []         = 0
           inWords (c:cs)
               | c == '`'     = 1 + inQuote cs
               | isAlphaNum c = inWords cs
               | otherwise    = outWords cs
           inQuote []         = 0
           inQuote (c:cs)
               | c == '\''    = outWords cs
               | otherwise    = inQuote cs

結果。

 *Main> wordsCount "`Theory of Everything' by Greg Egan"
 4