OCamlに慣れるために何か書こうと思ったけど、あまりいいネタが思い浮かばなかったのでLuhnアルゴリズムを書いてみた。クレジットカードの番号などを検証することができる。

#load "str.cma";;

let check_number number =
  let calculate i x =
    if i mod 2 = 0 then
      int_of_string x
    else
      let d = int_of_string x * 2 in d mod 10 + d / 10
  in

  Str.split (Str.regexp "") number
  |> List.rev
  |> List.mapi calculate
  |> List.fold_left (fun x y -> x + y) 0
  |> fun i -> i mod 10 = 0

let _ =
  (* テスト用のクレジットカード番号 *)
  let numbers = [
    "5555555555554444";
    "5105105105105100";
    "4111111111111111";
    "4012888888881881";
    "3530111333300000";
    "3566002020360505";
    "30569309025904";
    "38520000023237";
    "378282246310005";
    "371449635398431";
    "378734493671000";
    "6011111111111117";
    "6011000990139424";
  ] in
  List.iter (fun n -> n |> check_number |> string_of_bool |> print_string) numbers

参考文献

追記

有益な情報をいただきました。演算子気をつけよう