Итак, у меня есть эта функция, которая кажется не дружественной к хвостовому вызову, верно?
let rec insertFooInProperPosition (foo: Foo) (bar: list<Foo>): list<Foo> =
match bar with
| [] -> [ foo ]
| head::tail ->
if (foo.Compare(head)) then
foo::bar
else
head::(insertFooInProperPosition foo tail)
Затем я пытаюсь понять, как использовать аккумулятор, чтобы последнее, что делает функция, — это сам вызов, и у меня получается следующее:
let rec insertFooInProperPositionTailRec (foo: Foo) (headListAcc: list<Foo>) (bar: list<Foo>): list<Foo> =
match bar with
| [] -> List.concat [headListAcc;[ foo ]]
| head::tail ->
if (foo.Compare(head)) then
List.concat [headListAcc; foo::bar]
else
insertFooInProperPosition foo (List.concat [headListAcc;[head]]) tail
let rec insertFooInProperPosition (foo: Foo) (bar: list<Foo>): list<Foo> =
insertFooInProperPositionTailRec foo [] bar
Однако, насколько я понимаю, использование List.concat сделало бы эту функцию намного менее эффективной, верно? Итак, как мне правильно выполнить это преобразование?