You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

实现说明

  1. F#函数识别:F#的单参数/多参数函数本质上都是FSharpFunc<_,_>的嵌套实例(比如'a -> 'b -> 'c对应FSharpFunc<'a, FSharpFunc<'b, 'c>>),通过检查类型的泛型定义是否匹配FSharpFunc<_,_>即可识别。
  2. CLR委托兼容:通过判断类型是否继承自System.Delegate,可以兼容所有CLR标准委托类型,让函数的判断范围更全面。
  3. 普通值排除:对于int、object等非函数/委托类型,上述检查都会返回false,符合需求。

内容的提问来源于stack exchange,提问作者Franco Tiveron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:22:38