Comment detail

固定長データ (Nested Flatten)
敢えて冗長な書き方でやってみました。 メンテナンス性を考慮したつもりなんですが、見やすいかどうかは微妙です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
--
--    固定長データを参照する
--

module Main where

import System

--
--    base length
--
firstNameLen = 12
lastNameLen = 12
sexLen = 1
ageLen = 3
yearLen = 4
monthLen = 2
dateLen = 2
breakFastLen = 500
lunchLen = 500
dinnerLen = 500

--
--    base position
--
firstNamePos = 0
lastNamePos = firstNamePos + firstNameLen
sexPos = lastNamePos + lastNameLen
agePos = sexPos + sexLen
yearPos = agePos + ageLen
monthPos = yearPos + yearLen
datePos = 0
breakFastPos = datePos + dateLen
lunchPos = breakFastPos + breakFastLen
dinnerPos = lunchPos + lunchLen

--
--    length
--
userHeaderLen = firstNameLen + lastNameLen + sexLen + ageLen + yearLen + monthLen
userDataLen = dateLen + breakFastLen + lunchLen + dinnerLen
userLen = userHeaderLen + userDataLen * 31

--
--    position
--
userPos n = userLen * n
userDataPos n = userHeaderLen + userDataLen * n

--
--    access utility
--
cut d (pos, len) = take len $ drop pos d

getUser d n = cut d (userPos n, userLen)
getUserData user n = cut user (userDataPos n, userDataLen)

getFirstName user = cut user (firstNamePos, firstNameLen)
getLastName user = cut user (lastNamePos, lastNameLen)
getSex user = cut user (sexPos, sexLen)
getAge user = cut user (agePos, ageLen)
getYear user = cut user (yearPos, yearLen)
getMonth user = cut user (monthPos, monthLen)
getDate user n = cut (getUserData user n) (datePos, dateLen)
getBreakFast user n = cut (getUserData user n) (breakFastPos, breakFastLen)
getLunch user n = cut (getUserData user n) (lunchPos, lunchLen)
getDinner user n = cut (getUserData user n) (dinnerPos, dinnerLen)

--
--    example
--
main = do
    args <- getArgs
    contents <- if (not.null) args
        then readFile $ head args
        else getContents
    let user = getUser contents 0
    putStrLn $ show $ getLastName user
    putStrLn $ show $ getFirstName user
--    where
--        user n = "Jyunichiro  " ++ "Koizumi     " ++ "F" ++ "66" ++
--                "2008" ++ "03" ++ days
--        days = show $ map (\x -> (dayNo x) ++ foods) [1..31]
--        dayNo n = reverse $ take 2 $ reverse $ "0" ++ (show n)
--        foods = concat $ replicate 3 (replicate 500 ' ')

Index

Feed

Other

Link

Pathtraq

loading...