tfwh-0.3.7.0

Safe HaskellSafe
LanguageHaskell2010

TFwH.Chap02.ExH

Description

第2章 練習問題 H

  • addSum :: CIN -> CIN を構成せよ

    type CIN = String
    
    addSum :: CIN -> CIN
    addSum cin = cin ++ show (n div 10) ++ show (n mod 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)
    

Synopsis

Documentation

addSum :: CIN -> CIN Source #

8桁のIDにチェックサムを追加して10桁のIDにする getDigit を定義せずに,Data.Char.digitToInt :: Char -> Int を使いました. 剰余計算はdivmodを別々に使わず,divMod を使いました.

addSum :: CIN -> CIN
addSum cin = cin ++ show q ++ show r
             where
               (q,r) = sum (map digitToInt cin) divMod 10
>>> addSum "12345678"
"1234567836"

valid :: CIN -> Bool Source #

識別番号が正しいかどうかを判定する

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