Я хочу написать функцию, которая будет принимать произвольное число (curried) аргументов и просто распечатать их (или выполнить с ними другое неуказанное действие). Вот что я придумал:Функция с произвольным числом аргументов в F #
let print arg =
let rec print args arg =
if not (FSharpType.IsFunction(typeof<'t>)) then
printfn "%A" args
Unchecked.defaultof<'t>
else
print (box arg::args)
print []
Когда я пытаюсь скомпилировать это я получаю сообщение об ошибке The resulting type would be infinite when unifying ''t' and ''a -> 't
.
Я знаю, что могу просто передать аргументы в виде списка, но я пытаюсь разработать API, где это будет полезной идиомой.
Есть ли какой-нибудь умный трюк компилятора, чтобы сделать такую функцию возможной в F # или это потерянная причина?
Есть несколько способов, чтобы закодировать VARIADIC функции в F #, но компилятор трюк действительно действительно сложный. См. Это [ответ] (http://stackoverflow.com/questions/28243963/how-to-write-a-variadic-functios-in-f-emulating-a-similar-haskell-solution) – Gustavo
ну глупый я - явное обходное решение собирает все интересные типы ввода в ADT и просто использует список по этому типу. Я думаю, – Carsten
Спасибо Gustavo, этот ответ делает то, что я хотел. Я голосую, чтобы закрыть это как дубликат. Я, вероятно, должен был найти больше, прежде чем спрашивать, но был на самом деле дрянной связи, когда я спросил об этом. :-) – luksan