То, как вы делаете вещи, прекрасно. Любую рекурсивную функцию в списках можно выразить в виде сгиба, но я не думаю, что вы добьетесь этого, делая это здесь. Также нет встроенной функции, которая бы выполняла именно то, что вам нужно, но вы могли бы построить более общую функцию и построить свой конкретный расчет поверх этого. Вот один из таких подходов:
let rec allChoices = function
| [] -> [[]]
| l::ls ->
[for x in l do
for xs in allChoices ls do
yield x::xs]
let values hand =
hand |>
List.map cardValues |>
allChoices |>
List.map (List.sum)
Функция allChoices
берет список списков и возвращает каждый возможный список, содержащий по одному элементу из каждого (например, allChoices [[1];[2;3];[4;5]] = [[1;2;4];[1;2;5];[1;3;4];[1;3;5]]
). Мы используем эту функцию, чтобы получить все возможные списки значений для карт в руке, а затем суммировать каждый такой список.
Возможно, есть несколько других способов взглянуть на проблему, которые могут предложить другие варианты.