Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
第2章 練習問題 H
addSum :: CIN -> CIN
を構成せよtype CIN = String addSum :: CIN -> CIN addSum cin = cin ++ show (n
div
10) ++ show (nmod
10) where n = sum (map getDigit cin) getDigit :: Char -> Int getDigit c = read [c]
識別番号が正しいかどうかを判定する関数
valid :: CIN -> Bool
を構成せよvalid :: CIN -> Bool valid cin = cin == addSum (take 8 cin)
Documentation
8桁のIDにチェックサムを追加して10桁のIDにする
getDigit
を定義せずに,Data.Char.digitToInt :: Char -> Int
を使いました.
剰余計算はdiv
とmod
を別々に使わず,divMod
を使いました.
addSum :: CIN -> CIN
addSum cin = cin ++ show q ++ show r
where
(q,r) = sum (map digitToInt cin) divMod
10
>>>
addSum "12345678"
"1234567836"
識別番号が正しいかどうかを判定する
Data.Char
をインポートしてより細かいチェックを実施
valid :: CIN -> Bool valid cin = length cin == 10 && all isDigit cin && cin == addSum (take 8 cin)
>>>
valid "123456"
False>>>
valid "abcd56789a4"
False>>>
valid "1234567890"
False>>>
valid "12345678036"
False>>>
valid "1234567836"
True