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]
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]
- パターンマッチ
let expandTab = function
'\t' -> String.make tabStop ' '
| c -> String.make 1 c