| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
TFwH.Chap02.ExH
Description
第2章 練習問題 H
addSum :: CIN -> CINを構成せよtype CIN = String addSum :: CIN -> CIN addSum cin = cin ++ show (n
div10) ++ show (nmod10) 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