F#使用inline关键字编写多数值类型兼容Lerp函数遇类型推断问题
F# 多数值类型兼容Lerp函数解决方案
问题核心是代码中使用了固定类型的数值字面量:默认1为int类型、1.0为float类型,直接导致编译器将函数参数锁定为对应类型,即便添加inline关键字也无法实现泛型兼容。
解决方案
使用F#提供的泛型数值字面量替代固定类型字面量,配合inline的静态解析类型参数能力即可实现需求,有两种常用写法:
- 兼容性最好的通用写法,无需额外配置:
let inline Lerp a b t = (LanguagePrimitives.GenericOne - t) * a + t * b
- 更简洁的泛型字面量简写写法,在数字后加后缀
G即可标记为泛型数值:
let inline Lerp a b t = (1G - t) * a + t * b
效果验证
上述两种写法都可以同时适配多种数值类型调用,无需编写多个重载函数:
- int类型调用:
Lerp 0 100 1输出结果为100 - float类型调用:
Lerp 0.0 100.0 0.5输出结果为50.0 - float32类型调用:
Lerp 0.0f 100.0f 0.3f输出结果为30.0f
实现原理
inline关键字搭配泛型数值字面量会触发F#的静态解析类型参数(SRTP)机制,函数不会提前固定参数类型,编译时会针对调用时传入的不同数值类型,自动生成对应类型的专属代码,同时保留静态类型检查能力。
内容的提问来源于stack exchange,提问作者tigerros
相关产品推荐
相关产品推荐

