Pháp Sécurité Sociale số nhận dạng kết thúc bằng mã kiểm tra gồm hai chữ số. Tôi đã xác minh rằng mọi khả năng common transcription error có thể được phát hiện và tìm thấy một số loại lỗi khác (, ví dụ:, ba chữ số liên tiếp) có thể không bị phát hiện.OCaml tương đương với máy phát Python
def check_code(number):
return 97 - int(number) % 97
def single_digit_generator(number):
for i in range(len(number)):
for wrong_digit in "":
yield number[:i] + wrong_digit + number[i+1:]
def roll_generator(number):
for i in range(len(number) - 2):
yield number[:i] + number[i+2] + number[i] + number[i+1] + number[i+3:]
yield number[:i] + number[i+1] + number[i+2] + number[i] + number[i+3:]
def find_error(generator, number):
control = check_code(number)
for wrong_number in generator(number):
if number != wrong_number and check_code(wrong_number) == control:
return (number, wrong_number)
assert find_error(single_digit_generator, "0149517490979") is None
assert find_error(roll_generator, "0149517490979") == ('0149517490979', '0149517499709')
Mã Python 2.7 (đoạn làm việc ở trên) sử dụng nhiều máy phát. Tôi đã tự hỏi làm thế nào tôi có thể thích ứng với họ trong OCaml. Tôi chắc chắn có thể viết một chức năng duy trì một số trạng thái nội bộ, nhưng tôi đang tìm kiếm một giải pháp hoàn toàn chức năng. Tôi có thể nghiên cứu thư viện lazy
mà tôi không quá quen thuộc không? Tôi không yêu cầu mã, chỉ cần hướng dẫn.
Bất kỳ liên kết nào? Bạn có nói về mô-đun này ['Seq'] (http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Seq.html) không? – Aristide
Tôi đã thêm liên kết vào các mô-đun tương ứng. 'Seq' chỉ là bí danh của riêng tôi cho' Sequence'. Tôi đã đổi tên nó trở lại. Bạn có thể tìm thêm ví dụ về các liên kết được cung cấp. – ivg
Bạn có thể muốn xem xét chỉ cần mở Or_error.Monad_infix, thay vì toàn bộ mô-đun Or_error. Nói chung tốt hơn để mở ít hơn là nhiều hơn ... – yzzlr