rom*_*run 9 ocaml types external
我想知道为什么我们需要像"%identity"这样的函数,这与让a = a相同.是否会通过使用它来提高性能?
我在我的程序中引入幻像输入,调用身份函数很多次来转换类型,好奇如果"%identity"可以减少一点开销.
Jef*_*eld 11
该%identity函数是实现的一部分,而不是OCaml语言的一部分.它告诉编译器(实质上)没有任何事情可以将函数的参数更改为其返回值.换句话说,它告诉编译器继续使用相同的值,但改变它的类型的想法.如果使用不当,它基本上会使OCaml类型系统的所有出色安全保证无效.当然,它也不能保证在该语言的任何其他实现中工作(包括INRIA编译器的未来版本).
OCaml编译器的内联功能应该已经保证不会为身份函数生成代码.所以我建议你继续使用它们.
更新
在评论中回答一个不相关的问题....假设你有函数组合和身份函数:
let (<<) f g x = f (g x)
let id x = x
Run Code Online (Sandbox Code Playgroud)
然后,这里是添加列表元素,乘以列表元素以及组合列表中所有函数的函数:
# let sum l = List.fold_right (+) l 0;;
val sum : int list -> int = <fun>
# let product l = List.fold_right ( * ) l 1;;
val product : int list -> int = <fun>
# let composition l = List.fold_right (<<) l id;;
val composition : ('a -> 'a) list -> 'a -> 'a = <fun>
Run Code Online (Sandbox Code Playgroud)
例子:
# sum [2; 3; 5; 7];;
- : int = 17
# product [2; 4; 17];;
- : int = 136
# let mx = composition [(+) 1; ( * ) 10];;
val mx : int -> int = <fun>
# mx 2;;
- : int = 21
Run Code Online (Sandbox Code Playgroud)
关键是0是加法的标识,1是乘法的标识,id是函数组合.id一直很有用,就像0和1一样.
| 归档时间: |
|
| 查看次数: |
2675 次 |
| 最近记录: |