Я иногда пишу циклы (рекурсивные функции) внутри заданий. Это делает для неудобного кода, как это:
let value =
let rec loop a =
if ... then a
else loop a.B
loop a
Я знаю, что мог бы переместить цикл за пределы привязки let
, но его единственная цель - вычислить связанное значение.
Так что я подумал, что могу абстрагировать цикл в отдельную функцию:
let loop f a =
let rec aux a =
match f a with
| Some b -> aux b
| None -> a
aux a
тогда я мог бы сделать:
let value = a |> loop (fun a -> if ... then None else Some a.B)
Может быть, это и лучше - по крайней мере, это похоже на присваивание, а не определение функции. Вот мои вопросы:
- Связывает ли рекурсивная функция в
let
что-то с запахом кода?
- Есть ли лучший способ реорганизовать это?
- Если нет, можно ли обобщить мою функцию
loop
или как-то улучшить?