gcd, map for ocaml
gcd 的代码如下
1 2 3 4 5 6 7 8 | let gcd a b = let rec gcd_int x y = let r = x mod y in if r = 0 then y else gcd_int y r in if b = 0 then a else gcd_int a b ;; |
map的简单实现为
let rec map f = [] -> [] |h::l -> f h :: map f l ;; |
这个实现不是尾递归的,对于长表来说可能会栈溢出,尾递归的版本为
1 2 3 4 5 6 7 8 9 10 11 12 | let map f l = let reverse lst r = match lst with [] -> r | h::rest -> reverse rest (h::r) in let rec map_int f l r= match f with [] -> r | h::rest -> map_int f rest ((f h)::r) in reverse (map_int f l []) [] ;; |
仔细观察了一下reverse的代码,其实跟map_int的代码很像,其实是map_int里面函数为identity的特例,于是map可以重新实现为
1 let map f l = 2 let rec map_int g ll rr = 3 match ll with 4 | [] -> rr 5 | h::r -> map_int g r ( (g h) :: rr ) 6 in 7 map_int (fun i -> i) (map_int f l []) [] ;;
这样reverse的过程通过map_int来实现
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出