«Разорвать» в OCaml? - PullRequest
       27

«Разорвать» в OCaml?

2 голосов
/ 15 сентября 2011

У меня есть функция, которая использует List.fold_left2, чтобы проверить, является ли список палиндромом. (Использование сгиба не является обязательным: это домашнее задание.)

let is_p lst =
  List.fold_left2 (fun acc e1 e2-> if (e1=e2) then acc else false) true lst (List.rev lst)

Но я бы хотел оптимизировать это. Каков наилучший способ вернуть «ложь», как только будет найдено одно несоответствие?

Я бы предпочел не бросать исключения, но я понимаю, что это может быть лучшим ответом. Я также рассмотрел вопрос об изменении анонимной функции на:

fun acc e1 e2-> if (not acc) then false else (if (e1=e2) then acc else false)

1 Ответ

4 голосов
/ 15 сентября 2011

Либо используйте исключение, либо «разверните» фолд в пользовательскую рекурсивную функцию.Шаблон сгиба всегда пересекает весь список.

Обязательно сравните оба теста, поскольку обработка исключений может быть дорогостоящей операцией в некоторых языках (я не уверен, верно ли это для OCaml).

...