expand

ver.0(タブを'@'に置換)

main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = map translate cs

translate :: Char -> Char
translate c = if c == '\t' then '@' else c
  • 高階関数
    • 引数に関数を取る
  • if式
    • それ自体が値を持つ
    • thenとelseの型が同じでなければならない。
    • elseは省略不可
  • (==) :: a -> a -> Bool     # OCamlでは(=)

ver.1(タブを空白8コに置換)

main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = concat $ map expandTab cs

expandTab :: Char -> String
expandTab c = if c == '\t' then "        " else [c]
  • concat :: a -> [a]

ver.2

tabStop = 8

main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = concatMap expandTab cs

expandTab :: Char -> String
expandTab '\t' = replicate tabStop ' '
expandTab c    = [c]
  • concatMap :: (a -> [b]) -> [a] -> [b]
  • replicate :: Int -> a -> [a]
  • パターンマッチ
(* OCaml *)
let expandTab = function
    '\t' -> String.make tabStop ' '
  | c    -> String.make 1 c