2014年1月27日月曜日

開発環境

Real World Haskell―実戦で学ぶ関数型言語プログラミング(Bryan O'Sullivan (著)、 John Goerzen (著)、 Don Stewart (著)、山下 伸夫 (翻訳)、伊東 勝利 (翻訳)、株式会社タイムインターメディア (翻訳)、オライリージャパン)の4章(関数プログラミング)、4.5(リストを使う)、練習問題 4.を解いてみる。

その他参考書籍

練習問題 4.

コード(BBEdit, Emacs)

InteractWith.hs

{-# OPTIONS -Wall -Werror #-}
module Main where

import System.Environment (getArgs)

main :: IO ()
main = mainWith myFunction

mainWith :: (String -> String) -> IO ()
mainWith function = do
    args <- getArgs
    case args of
         [input, output] -> interactWith function input output
         _ -> putStrLn "error: exactly two arguments needed"

myFunction :: String -> String
myFunction s = let ls = lines s
                   n = length ls
                   m = maxLength ls
                   l = if n > m then n else m
               in myFunction1 (rectangle l ls)

maxLength :: [String] -> Int
maxLength xs = maxLength1 xs 0

maxLength1 :: [String] -> Int -> Int
maxLength1 [] n = n
maxLength1 (x:xs) n = let m = length x
                      in if m > n
                         then maxLength1 xs m
                         else maxLength1 xs n

interactWith :: (String -> String) -> FilePath -> FilePath -> IO ()
interactWith function inputFile outputFile = do
    input <- readFile inputFile
    writeFile outputFile (function input)

myFunction1 :: [String] -> String
myFunction1 xs = joinN (myFunction2 xs)

rectangle :: Int -> [String] -> [String]
rectangle _ [] = []
rectangle n (x:xs) = (addSpaces (n - length x) x):rectangle n xs

addSpaces :: Int -> String -> String
addSpaces n s = if n == 0 then s else addSpaces (n - 1) (s ++ " ")

joinN :: [String] -> String
joinN [] = []
joinN (x:xs) = x ++ '\n':joinN xs

myFunction2 :: [String] -> [String]
myFunction2 [] = []
myFunction2 (x:[]) = heads x
myFunction2 (x:xs) = zipWith (++) (heads x) (myFunction2 xs)

heads :: String -> [String]
heads [] = []
heads (x:xs) = [[x]] ++ heads xs

入出力結果(Terminal, runghc)

$ runghc InteractWith.hs temp.txt output.txt
$ cat temp.txt
The Project Gutenberg EBook of Punch, or the London Charivari, Vol. 108,
May 11th, 1895, by Various

This eBook is for the use of anyone anywhere at no cost and with
almost no restrictions whatsoever.  You may copy it, give it away or
re-use it under the terms of the Project Gutenberg License included
with this eBook or online at www.gutenberg.org/license


Title: Punch, or the London Charivari, Vol. 108, May 11th, 1895

Author: Various

Editor: Sir Francis Burnand

Release Date: January 26, 2014 [EBook #44760]

Language: English


*** START OF THIS PROJECT GUTENBERG EBOOK PUNCH, VOL. 108, MAY 11TH, 1895 ***




Produced by Malcolm Farmer, Lesley Halamek and the Online
Distributed Proofreading Team at http://www.pgdp.net
$ cat output.txt
TM Tarw  T A E R L  *    PD
ha hlei  i u d e a  *    ri
ey im-t  t t i l n  *    os
   souh  l h t e g       dt
P1  ss   e o o a u  S    ur
r1 etet  : r r s a  T    ci
ot B  h    : : e g  A    eb
jh onii  P       e  R    du
e, oots  u V S D :  T     t
c  k     n a i a         be
t1  rue  c r r t E  O    yd
 8 ienB  h i   e n  F      
G9 ssdo  , o F : g       MP
u5  teo    u r   l  T    ar
t, frrk  o s a J i  H    lo
e  oi    r   n a s  I    co
nb rcto      c n h  S    of
by  thr  t   i u         lr
e  tie   h   s a    P    me
rV ho o  e     r    R     a
ga entn      B y    O    Fd
 r  sel  L   u      J    ai
Ei u ri  o   r 2    E    rn
Bo swmn  n   n 6    C    mg
ou ehse  d   a ,    T    e 
os  a    o   n           rT
k  otoa  n   d 2    G    ,e
   fsft        0    U     a
o   o    C     1    T    Lm
f  aetw  h     4    E    e 
   nvhw  a          N    sa
P  yeew  r     [    B    lt
u  or .  i     E    E    e 
n  n.Pg  v     B    R    yh
c  e ru  a     o    G     t
h    ot  r     o         Ht
,  aYje  i     k    E    ap
   noen  ,          B    l:
o  yucb        #    O    a/
r  w te  V     4    O    m/
   hm r  o     4    K    ew
t  eaGg  l     7         kw
h  ryu.  .     6    P     w
e  e to        0    U    a.
    cer  1     ]    N    np
L  aong  0          C    dg
o  tpb/  8          H     d
n   yel  ,          ,    tp
d  n ri                  h.
o  oigc  M          V    en
n   t e  a          O     e
   c,Ln  y          L    Ot
C  o is             .    n 
h  sgce  1               l 
a  tie   1          1    i 
r   vn   t          0    n 
i  aes   h          8    e 
v  n e   ,          ,      
a  di                      
r   ti   1          M      
i  w n   8          A      
,  iac   9          Y      
   twl   5                 
V  hau              1      
o   yd              1      
l    e              T      
.   od              H      
    r               ,      
1                          
0                   1      
8                   8      
,                   9      
                    5      
                           
                    *      
                    *      
                    *      
$

0 コメント:

コメントを投稿