Ответ на ваш первый вопрос заключается в том, что вы не можете сделать это вообще. Список - это структура данных с динамической длиной, но длина результирующего кортежа должна быть известна статически во время компиляции. (Вы можете создать полученный кортеж, используя отражение, и использовать его как obj
, но это не очень полезно.)
Во втором случае вы хотите превратить список функций в функцию, возвращающую список, что можно сделать (обе имеют динамическую длину). Вы можете написать что-то вроде:
let funcs =
[ (fun n -> n + 1)
(fun n -> n * 2) ]
let merged =
funcs |> List.fold (fun agg f ->
fun inp -> (f inp)::(agg inp)) (fun _ -> [])
Примитивная операция (переданная в fold
) - это функция, которая принимает функцию типа TInp -> TOut list
и функцию TInp -> TOut
и объединяет их в функцию, возвращающую более длинный список. Таким образом, вы также можете написать:
// val addResult : ('a -> 'b list) -> ('a -> 'b) -> 'a -> 'b list
let addResult agg f inp = (f inp)::(agg inp)
// val merge : ('a -> 'b) list -> ('a -> 'b list)
let merge funcs = funcs |> List.fold addResult (fun _ -> [])