Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming F中泛型类型的泛型函数#_Functional Programming_F# - Fatal编程技术网

Functional programming 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

我正在学习用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=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
有什么看法?@DmitryVolkov
inline
在调用时会进行扩展,但它的功能要强大得多。通过这样做,它传播所使用的任何通用算术运算符的成员约束。据我所知,FP通常对
inline
的使用漠不关心。过度使用它们会使调试更加困难。对于一般算术运算,它们是一种简单有效的解决方案。另一种选择是使用约束,但事实证明这些约束更难实现。如果您还没有看到它们,那么使用F#docs可能会有所帮助,还可以查看。