如何在F#中编写可变参数函数以模拟类似的Haskell解决方案?

罗布兹

我如何(如果有的话)模拟可变函数(不是方法),以便我可以编写

sum 1 2 3
sum 1 2 3 4 5
sum 1 2 3 4 5 6 7
// etc.

上面的代码仅作为示例-显然,如果我必须总结一个列表,那么

[ 1; 2 ; 3] |> List.sum 

是更好的方法。

但是我正在寻找一种结构类似的解决方案,例如Haskell解决方案

同样重要的是,函数调用和参数值常规语法保持不变。所以

sum 1 2 3

sum(1, 2, 3)

这实际上意味着

let sum ([<ParamArray>] arr) = ...

在这种特定情况下不需要。

所有这些的动机:我正在探索F#的类型系统和语法的外部边缘。我完全意识到,我可能已经跨越了可能的界限。

PS:我的具体想法(在此未描述)也可以完全不同地解决-我知道,所以我已经做到了。因此,我的问题不是:如何能以不同的方式解决这个问题,而又如何像Haskell那样在结构上解决呢?

PPS:如果您可以使整个解决方案递归,则加倍Karma-Points。

古斯

您说的是功能,而不是方法。所以ParamArray不是一种选择。

您链接的Haskell代码基于推断的结果类型。

这是一种基于F#中推断的结果类型进行解析的方法:

type T = T with
    static member inline ($) (T, r:'t->'t        ) = fun a b     -> a + b
    static member inline ($) (T, r:'t->'t->'t    ) = fun a b c   -> a + b + c
    static member inline ($) (T, r:'t->'t->'t->'t) = fun a b c d -> a + b + c + d

let inline sum (x:'a) :'r = (T $ Unchecked.defaultof<'r>) x

let x:int = sum 2 3 
let y:int = sum 2 3 4
let z:int = sum 2 3 4 5
let d:decimal = sum 2M 3M 4M

let mult3Numbers a b c = a * b * c
let res2 = mult3Numbers 3 (sum 3 4  ) 10
let res3 = mult3Numbers 3 (sum 3 4 5) 10

更新

上面的代码从F#4.1起不再起作用(请参阅注释),但是这是一个更好的示例,其中带有n个(无限制)参数的递归多变量函数:

type T = T with
    static member        ($) (T, _:int    ) = (+)
    static member        ($) (T, _:decimal) = (+)

let inline sum (i:'a) (x:'a) :'r = (T $ Unchecked.defaultof<'r>) i x

type T with
    static member inline ($) (T, _:'t-> 'rest) = fun (a:'t) -> (+) a >> sum


let x:int = sum 2 3 
let y:int = sum 2 3 4
let z:int = sum 2 3 4 5
let d:decimal = sum 2M 3M 4M

let mult3Numbers a b c = a * b * c
let res2 = mult3Numbers 3 (sum 3 4) (sum 2 2 3 3)
let res3 = mult3Numbers 3 (sum 3 4 5 11 13 20) 10

您还可以查看此多变量折叠

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Common Lisp中编写类似的函数?

可变参数函数是否是可选参数的合适解决方案?

c ++ 11是否提供与python maketrans / translate中实现的解决方案类似的解决方案?

如何通过F#在函数中创建可变参数?

如何在Python中编写此C for循环?-最好的解决方案是什么?

如何在Javascript中为变量内部编写for循环,或者有替代解决方案?

如何在 PHP Laravel 中编写类似的代码?

当给定由字母“ a”或/和“ b”组成的字符串时,如何在Java中编写函数解决方案,当“ a”出现在“ b”之前时返回true?

如何从类似的函数调用具有可变数量的参数的函数?

如何在R中的一个函数中找到多个解决方案?

如何将多个可执行F#文件组织到一个VS解决方案中?

如何在ReasonML中编写带有类型变量的函数以接受任何类型的参数?

如何解决类似于计数排序的解决方案?

除了<|以外,还有什么与F#中Haskell的$类似的* else *?

如何在Powershell中编写函数以创建函数

如何在R中创建类似的python函数?

如何在嵌套优化中返回解决方案?

如何在解决方案中运行所有测试

如何在AWS Personalize中解释解决方案指标?

如何在C ++中设置多项目解决方案?

如何在 Maxima 中只获得真正的解决方案?

如何在解决方案中通过 FQN 查找类型?

如何在F#中编写csv?

F#中的类中数组分配的说明和惯用解决方案

解决方案中的 C# 项目现在显示为 F#

如何在Julia中编写一个接受可变数量参数的函数?

JavaScript:使用高阶函数编写此解决方案

使用Ajax请求(或类似的Javascript解决方案)加载php循环

流中网络呼叫ID的RxJava缓存结果(Redis或类似的缓存解决方案)