Ваше определение уже довольно функционально, так как оно использует хвостовую рекурсивную функцию вместо конструкции императивного цикла.Тем не менее, это также похоже на то, что программист Scheme мог бы написать, потому что вы используете head
и tail
.
Я подозреваю, что вы действительно спрашиваете, как написать это в более идиоматическом стиле ML.Ответ заключается в использовании сопоставления с образцом:
let rec getPos list n =
match list with
| hd::tl ->
if n = 0 then hd
else getPos tl (n - 1)
| [] -> failWith "Index out of range."
Рекурсия по структуре списка теперь раскрывается в коде.Вы также получаете предупреждение, если сопоставление с образцом не является исчерпывающим, поэтому вы вынуждены иметь дело с слишком большой ошибкой индекса.
Вы правы, что функциональное программирование также поощряет использование комбинаторов, таких как map или fold(так называемый стиль без очков).Но слишком много всего этого приводит к нечитаемому коду.Я не думаю, что в этом случае это оправдано.
Конечно, Бенджол прав, на практике вы просто пишете mylist.[n]
.