Мне нравится писать некоторые математические функции на F# и использовать их на C#. Поскольку в F# используются единицы измерения, очень удобно иметь проверку во время компиляции. В С# у меня уже есть класс Length (индексатор, который преобразуется в м, мм, км и т. д.), поэтому я хочу использовать его в качестве параметра из С# с помощью функции F# и преобразовать его там в число с плавающей запятой или более конкретное число с плавающей запятой.
Поскольку у меня есть два параметра, я изо всех сил пытаюсь вызвать функции. Думаю, это как-то связано с карри.
module Static
open Xunit
open Units.Contract // here is my Length class defined in C#
[<Measure>] type m
[<Measure>] type slabThickness = m
[<Measure>] type kN
[<Measure>] type freshConcreteDensity = kN/m^3
[<Measure>] type freshConcreteLoad = kN/m^2
let FreshConcreteLoad(slabThickness:float<m>, freshConcreteDensity:float<kN/m^3>) = slabThickness * freshConcreteDensity // 1. works
let FreshConcreteLoadL(slabThickness:Length, freshConcreteDensity:Length) = slabThickness.[Length.Units.m] * freshConcreteDensity.[Length.Units.m] //2. works
let FreshConcreteLoadLUseMeasure(slabThickness:Length, freshConcreteDensity:Length) = FreshConcreteLoad (slabThickness.[Length.Units.m]:float<m> freshConcreteDensity.[Length.Units.m]:float<kN/m^3>) //3. here I struggel
// Related to 1. and works
[<Fact>]
let FreshConcreteLoad_Test() =
let thickness = 0.2<slabThickness>
let density = 25.0<freshConcreteDensity>
let load:float<freshConcreteLoad> = FreshConcreteLoad(thickness,density)
Assert.Equal(load, 5.0<kN/m^2>)
// Related to 2. and works
[<Fact>]
let FreshConcreteLoadL_Test() =
let thickness = new Length(0.2)
let density = new Length(25.0) // dont care that this is now also a length, just for testing. in real live here would be a class for kN
let load:float = FreshConcreteLoadL(thickness,density)
Assert.Equal(load, 5.0)
// Related to 3. and I struggle with the function call
[<Fact>]
let FreshConcreteLoadLUseMeasure_Test() =
let thickness = new Length(0.2)
let density = new Length(25.0) // dont care that this is now also a length, just for testing. in real live here would be a class for kN
let load:float = FreshConcreteLoadLUseMeasure(thickness,density)
Assert.Equal(load, 5.0)