Оборачивание функции с неопределенным количеством параметров в F # - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь написать простой класс-обертку на F #, который принимает функцию, которая возвращает строку, и возвращает функцию, которая принимает те же параметры и возвращает строку из входных данных 'wrapped'.

Следующий код работает для функций, которые принимают одну переменную (поэтому test работает нормально):

open System

let myFunc anotherFunc =
    fun x -> "boo" + anotherFunc x + "unboo"

let Func2 toDouble =
    (toDouble * 2).ToString ()

let test = myFunc Func2

let Func3 numOne numTwo =
    (numOne * numTwo).ToString ()

let test2 = myFunc Func3

do
    Console.WriteLine(test 10)
    Console.WriteLine(test2 5 10)

Но поскольку fun x -> указывает один параметр, test2 не является допустимым кодом.Есть ли часть синтаксиса, которая позволила бы эту конструкцию?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Самое простое решение - написать Func3 как функцию, которая принимает кортеж.Таким образом, функция будет принимать только один параметр, но вы можете передать ему оба числа:

// Function takeing a single argument, which is a tuple
let Func3 (numOne, numTwo) = 
  (numOne * numTwo).ToString () 

let test2 = myFunc Func3      

// The created function takes a tuple as well
Console.WriteLine(test2(5, 10))

В общем, нет хорошего способа написать функцию высшего порядка, которая принимает функциюпринимая любое количество параметров.Этот вид универсальности не может быть легко закодирован в F #.Вы можете использовать Reflection для создания чего-то подобного (но это было бы неэффективно и небезопасно), или вы могли бы написать более сложное кодирование параметров, но я думаю, что кортеж - лучший вариант.

1 голос
/ 05 декабря 2011

Ваша функция работает.Проблема в последней строке, когда вы делаете

let test2 = myFunc Func3

должно быть

let test2 x = myFunc (Func3 x)

ОБНОВЛЕНИЕ:

Я предполагаю, что вы не хотите менять Func3,В противном случае решение от Томаса может быть тем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...