我了解 F# 中函数组合的基础知识,例如所述here http://blogs.msdn.com/b/chrsmith/archive/2008/06/14/function-composition.aspx.
不过,也许我错过了一些东西。这>>
and <<
运算符似乎是在每个函数仅采用一个参数的假设下定义的:
> (>>);;
val it : (('a -> 'b) -> ('b -> 'c) -> 'a -> 'c) = <fun:it@214-13>
> (<<);;
val it : (('a -> 'b) -> ('c -> 'a) -> 'c -> 'b) = <fun:it@215-14>
然而,我想做的事情如下:
let add a b = a + b
let double c = 2*c
let addAndDouble = add >> double // bad!
但即使add
的输出是所需的类型double
的输入,即被拒绝。
我知道我可以用一个元组参数重写 add :
let add (a,b) = a + b
或者我可以为第一个函数的每个可能参数编写一个新运算符:
let inline (>>+) f g x y = g (f x y)
let doubleAdd = add >>+ double
但这似乎很愚蠢!有我错过的更好的方法吗?
您想要的并非完全不合理,但无法在 F# 的类型系统中指示广义组合运算符的类型。就是没有什么好的办法统一
(>>) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c
and
(>>+) : ('a -> 'b -> 'c) -> ('c -> 'd) -> 'a -> 'b -> 'd
(更不用说无限多个更高数量的版本)。因此,您别无选择,只能定义自己的附加运算符。在实践中,我经常发现以“尖头”风格编写的代码let f x y = add x y |> double
比无点/“无意义”更具可读性let f = add (>>+) double
anyway.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)