프랑스어 세큐리티 소셜 식별 번호는 두 자리 숫자로 끝납니다. 가능한 모든 가능한 common transcription error을 감지 할 수 있었으며 발견되지 않은 채 다른 종류의 오류 (예 :, 3 자리 연속)가 있음을 확인했습니다.OCaml에 상응하는 파이썬 생성기
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')
내 Python 2.7 코드 (위의 작업 조각)는 생성기를 많이 사용합니다. OCaml에서 어떻게 적용 할 수 있을지 궁금합니다. 확실하게 내부 상태를 유지하는 함수를 작성할 수는 있지만 순전히 기능적 솔루션을 찾고 있습니다. lazy
라이브러리를 공부해도 좋을까요? 나는 코드를 요구하지 않고 지시 만 받는다.
어떤 링크가 있습니까? 이 ['Seq'] (http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Seq.html) 모듈에 대해 이야기합니까? – Aristide
해당 모듈에 대한 링크를 추가했습니다. 'Seq'는'Sequence'에 대한 제 별명입니다. 이름을 다시 바꿨습니다. 제공된 링크에서 더 많은 예제를 찾을 수 있습니다. – ivg
전체 Or_error 모듈 대신 Or_error.Monad_infix를 여는 것을 고려할 수도 있습니다. 일반적으로 더 적은 것보다는 더 적은 것을 여는 것이 더 낫습니다 ... – yzzlr