Вызов функций BCL с аргументами кортежей в F # - PullRequest
1 голос
/ 15 августа 2011

Из того, что я прочитал, и, если я не ошибаюсь, кажется, что любой метод BCL получает свои аргументы в виде кортежа в F #.Поэтому мне было интересно, если бы вместо

let rndNumber= rng.Next(-10, 10)

я мог бы получить что-то вроде

let range = (-10, 10)
let rndNumber = rng.Next range

, полный код будет следующим:

open System
let rng = new Random()
let range = (-10, 10)
let rndNumber = rng.Next range

, и я получаю ошибку

This expression was expected to have type
    int    
but here has type
    int * int    

Ответы [ 2 ]

7 голосов
/ 15 августа 2011

У вас может быть перегрузка метода .NET, которая также принимает один аргумент типа System.Tuple, что усложняет ситуацию.

В общем случае F # просматривает сайт вызова метода и синтаксически определяеткоторый перегружает, чтобы попробовать.При вызове o.M aTupleVar F # пытается найти метод, принимающий один аргумент (который является кортежем), в отличие от нескольких аргументов.

Обходной путь "piping", предложенный Дэниелом, работает, потому что нет синтаксического вызова метода, поэтому F # просто разрешает rng.Next в группу методов перегрузки с этим именем и разрешает вызов позже.

Тем не менее, на практике почти никогда нет причин для этого.Если вы собираетесь вызывать метод .NET, делайте это напрямую с помощью o.M(arg1,arg2), редко возникает необходимость / желание сначала создать кортеж.

4 голосов
/ 15 августа 2011

Попробуйте вместо этого:

let rndNumber = range |> rng.Next

Я думаю, что отсутствие информации о типе в точке вызова метода приводит к тому, что он по умолчанию принимает первую перегрузку (принимая int).Если вы передадите ему аргумент, он знает, какую перегрузку вы хотите.

...