Как передать требуемую перегрузку System.Random.Next в мою функцию F #? - PullRequest
1 голос
/ 05 апреля 2019

Просто начинаю с F #.Может кто-нибудь сказать мне, почему я не могу передать перегрузку Next, которая принимает два int параметра и возвращает int моей функции printNext?Насколько я могу судить, типы выстраиваются ... но это не то, что говорит компилятор.

open System

let r = new Random()

let printNext (nextInt : int -> int -> int) =

    let i = nextInt 0 100

    printf "%d" i

let t x y = x + y

// compiles fine
printNext t

// compilation error
printNext r.Next

enter image description here

Ответы [ 2 ]

6 голосов
/ 05 апреля 2019

Проблема в том, что ваша функция printNext принимает параметр типа int -> int -> int, а метод Random.Next имеет тип int * int -> int. То есть вы ожидаете, что функция принимает curry параметров, но обеспечивает функцию, принимающую кортежные параметры.

Проблема в не в том, что компилятор не может найти правильный перегруженный метод, а в том, что нет перегруженного Random.Next метода, принимающего параметры карри.

Все это может показаться запутанным, и к этому нужно привыкнуть, но карри - довольно приятный инструмент, когда вы его узнаете. Например, он позволяет частичное применение . Проблема, возникающая при переходе на F #, заключается в том, что такой метод, как Random.Next, изначально был разработан для потребления в C # и, следовательно, не имеет параметров карри.

Обновление: Я забыл фактическое решение вашей проблемы, предоставленное @ 3615. Я добавлю это здесь для завершения, чтобы ничего не брать из ответа @ 3615.

Решение в этом случае - написать оболочку для метода Random.Next. Если вы будете использовать его несколько раз, вы можете поместить его в переменную - в противном случае просто используйте анонимную функцию. Любое из следующего будет работать

let nextRnd x y = r.Next(x, y)
printNext nextRnd

printNext (fun  x y-> r.Next(x,y))
2 голосов
/ 05 апреля 2019

В этом случае компилятор F # не может определить, что вам нужна перегрузка с двумя параметрами, и он выбирает перегрузку с одним параметром.Чтобы обойти это, вы можете обернуть этот метод следующим образом: printNext (fun x y-> r.Next(x,y))

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