計算機科学のブログ

コードの整理とプロジェクトのビルド Monad型クラス Haskellコードをモジュールにまとめる Text型、Data.Textモジュール、Data.Text.IOモジュール

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT6(コードの整理とプロジェクトのビルド)、LESSON34(Haskellコードをモジュールにまとめる)、34.4(練習問題)Q34-1の解答を求めてみる。

コード

Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import qualified Palindrome

main :: IO ()
main = do
  -- print "Enter a word and I'll let you know if it's a palindrome"
  -- text <- TIO.getLine
  -- let response =
  --       if Palindrome.isPalindrome text
  --         then "it is!"
  --         else "it's not!"
  -- print response
  mapM_
    (print . Palindrome.isPalindrome)
    [ "racecar",
      "Racecar",
      "race car",
      "racecar!",
      "race"
    ]

コード

Palindrome.hs

{-# LANGUAGE OverloadedStrings #-}

module Palindrome
  ( isPalindrome,
    preprocess,
  )
where

import Data.Char (isPunctuation)
import qualified Data.Text as T
import qualified GhcPlugins as T

isPalindrome :: T.Text -> Bool
isPalindrome text =
  let clearText = preprocess text
   in clearText == T.reverse clearText

preprocess :: T.Text -> T.Text
preprocess = stripWhiteSpace . stripPunctuation . toLowerCase

stripWhiteSpace :: T.Text -> T.Text
stripWhiteSpace text = T.intercalate "" $ T.words text

stripPunctuation :: T.Text -> T.Text
stripPunctuation text =
  T.pack $
    filter
      (not . isPunctuation)
      $ T.unpack text

toLowerCase :: T.Text -> T.Text
toLowerCase = T.toLower

入出力結果(Terminal, Zsh)

% runghc Main.hs
True
True
True
True
False
%