2014-11-03 4 views
0

Это довольно тривиальная вещь, но я действительно пытаюсь заставить ее работать. Я хочу привести результаты sqrt n, где n имеет тип int64 и, наконец, передать это функции, которая принимает int, но я действительно изо всех сил пытаюсь получить достойное решение, это то, как я придумал, но это отвратительно и я не могу поверить, что что-то, что так тривиально делать, например, C# должно быть так сложно в F #.F # casting a int

n 
|> float 
|> sqrt 
|> int 
|> function 
+0

Вы хотите преобразовать int64 в int32? let bignum = 155556L let myint = int (bignum) ;; – ArthurCPPCLI

+0

Версия C# сохраняет только один бросок с 'long' до' double'. – Lee

ответ

3

Это F # - если у вас нет того, что вы хотите, напишите функцию. Например:

let inline sqrttoint n = 
    (int (sqrt (float n))) 

n |> sqrttoint |> function 

На вершине, что он работает на все, что может бросить в float.

Основная проблема C# vs F # заключается в том, что вы используете C#, где числовые типы автоматически повышаются, тогда как F # хочет, чтобы вы заботились о типе большинства всего, и изменения типа должны быть более явными.

+0

Да, я имею в виду, что я полагал, что это действительно связано с тем, что я привык к тому, как дела обстоят иначе в F #. Но это немного расстраивает. –

+1

Да, иногда это расстраивает, но когда вы начинаете использовать свои функции в качестве объектов первого класса и используете приложение с частичной функцией, вы обнаружите, что сила типа является большой победой для правильности кода. Эквивалентный код C# (int) Math.Sqrt (someInt64) будет делать в значительной степени то, что у меня там есть, и в значительной степени прикладывает столько усилий для ввода. Различный язык, разные идиомы. – plinth