Functional programming F中泛型类型的泛型函数#
我正在学习用F#进行函数编程,我想写一个函数来提高数值的幂。我是这样写的:Functional programming F中泛型类型的泛型函数#,functional-programming,f#,Functional Programming,F#,我正在学习用F#进行函数编程,我想写一个函数来提高数值的幂。我是这样写的: let raiseToPower a power = let folding x _ = x * a [1..power-1] |> List.fold folding a let result = raiseToPower 2 5 我没有指定输入变量a的类型,因此我可以将此函数与float或integer number一起使用,但不能同时使用两者 let result=raiseToPowe
let raiseToPower a power =
let folding x _ = x * a
[1..power-1] |> List.fold folding a
let result = raiseToPower 2 5
我没有指定输入变量a
的类型,因此我可以将此函数与float或integer number一起使用,但不能同时使用两者
let result=raiseToPower 2.35//OK
//单独的程序
让结果=提高功率2 5//OK
//单独的程序
让result1=raiseToPower 2.3 5//OK
让结果2=提高功率2 5//失败
第一个问题是:
有没有办法让它变得通用?
我之所以为F#函数做了一个内置实现,是因为我想在自定义类型中使用类似的函数,例如复数 考虑以下几点:
type ComplexNumber = {re: double; im: double;}
let (@*) cn1 cn2 =
{re = cn1.re * cn2.re - cn1.im * cn2.im; im = cn1.re * cn2.im + cn1.im * cn2.re}
我有一个新类型ComplexNumber
和一个新运算符,它将两个复数相乘。现在,我可以编写一个类似的函数来提升ComplexNumber
的功率:
let raiseCnToPower a power =
let folding x _ = x @* a
[1..power-1] |> List.fold folding a
第二个问题是:
是否有办法使初始函数与自定义类型和自定义运算符一起工作?
结论性问题:
我想知道您在函数式编程方面应该做些什么。这被认为是一个问题,或者不同类型的不同函数执行几乎相同的操作可以吗?有没有办法改进函数式编程和F方面的解决方案?一个简单的方法是将其声明为内联的
:
let inline raiseToPower a power =
let folding x _ = x * a
[1..power] |> List.fold folding (a / a) // <- handles power = 0
let result1 = raiseToPower 2 5
let result2 = raiseToPower 2. 5
让内联raiseToPower a power=
设折叠x u=x*a
[1..power]|>List.fold-fold-folding(a/a)//这有什么帮助?让内联raiseToPower a power=List.replicate power a |>List.fold(*)LanguagePrimitives.GenericOne
也处理power=0,尽管不<0。和pown比较一下。嘿,AMieres!谢谢你的回答!我有一个问题:如果代码>内联< /COD>在F中工作,它和C++一样工作,编译器每次使用时都会复制函数,这不是一个坏的解决方案吗?一般来说,函数式编程对inline
有什么看法?@DmitryVolkovinline
在调用时会进行扩展,但它的功能要强大得多。通过这样做,它传播所使用的任何通用算术运算符的成员约束。据我所知,FP通常对inline
的使用漠不关心。过度使用它们会使调试更加困难。对于一般算术运算,它们是一种简单有效的解决方案。另一种选择是使用约束,但事实证明这些约束更难实现。如果您还没有看到它们,那么使用F#docs可能会有所帮助,还可以查看。