Как я могу встроить вызов функции в другую функцию? - PullRequest
2 голосов
/ 10 февраля 2012

Итак, у меня есть функция, которую я извлек из учебника:

let sumOfSquares nums = 
    nums
    |> Seq.map sqr
    |> Seq.sum

Я решил, что хочу проверить его производительность.В подходе грубой силы я бы сделал что-то вроде:

let timeFunction nums =
    let sw = new System.Diagnostics.Stopwatch()
    sw.Start()
    nums
        |> Seq.map sqr
        |> Seq.sum
    sw.Stop()
    sw.ElapsedMilliseconds

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

let timeFunction fn x =
    let sw = new System.Diagnostics.Stopwatch()
    sw.Start()
    fn x
    sw.Stop()
    sw.ElapsedMilliseconds

И затем я попытался вызвать его:

let sequenceOfNums = [for i in 1..20 -> i]
let print n = System.Console.WriteLine(n.ToString())
print "Time Trial"
print (timeFunction sumOfSquares sequenceOfNums)

Однако это не удается из-за следующей ошибки:

Несоответствие типов.Ожидается единица 'a ->, но дано значение' a -> int. Тип 'unit' не соответствует типу 'int'

в строке, которая вызывает функцию.Есть ли у меня какая-то синтаксическая ошибка или я неправильно понял концепцию?

1 Ответ

4 голосов
/ 10 февраля 2012

Поскольку результат fn не используется, предполагается, что он равен unit. Вы можете исправить это, передав результат в функцию ignore. Его подпись 'a -> unit, поэтому она делает тип возвращаемого значения fn универсальным (что вам нужно).

let timeFunction fn x =
    let sw = new System.Diagnostics.Stopwatch()
    sw.Start()
    fn x |> ignore
    sw.Stop()
    sw.ElapsedMilliseconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...