F#技术实现:如何判断传入参数是否为函数?
实现F#的isFunction函数判断参数是否为函数
要实现判断传入参数是函数还是普通值的isFunction函数,我们可以借助反射检查参数类型的特征。F#中的函数在CLR层面以FSharpFunc<_,_>类型存在,同时我们也可以兼容CLR标准委托类型(如Func、Action),具体实现如下:
open System.Reflection open Microsoft.FSharp.Core let isFunction value = let rec checkFunctionType (t: System.Type) = // 检查是否为F#原生函数类型(FSharpFunc) if t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<FSharpFunc<_,_>> then true // 检查是否为CLR委托类型(如Func、Action) elif typeof<System.Delegate>.IsAssignableFrom(t) then true else false checkFunctionType (value.GetType())
测试示例
// 定义F#函数 let addNumbers p1 p2 = p1 + p2 // 定义普通值 let intValue = 5 let objValue = obj() // 定义CLR委托 let clrFunc = System.Func<int, int, int>(fun x y -> x * y) isFunction addNumbers // 返回 true isFunction intValue // 返回 false isFunction objValue // 返回 false isFunction clrFunc // 返回 true
实现说明
- F#函数识别:F#的单参数/多参数函数本质上都是
FSharpFunc<_,_>的嵌套实例(比如'a -> 'b -> 'c对应FSharpFunc<'a, FSharpFunc<'b, 'c>>),通过检查类型的泛型定义是否匹配FSharpFunc<_,_>即可识别。 - CLR委托兼容:通过判断类型是否继承自
System.Delegate,可以兼容所有CLR标准委托类型,让函数的判断范围更全面。 - 普通值排除:对于int、object等非函数/委托类型,上述检查都会返回false,符合需求。
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

