F# FSI 不会在内联函数中中断

F# FSI does not hit break inside inline function

我有几个通用的内联函数,例如:

let inline getRatesImpl<'T when 'T : (member enantiomer : 'T) and 'T : equality> 
    (d : Dictionary<'T, (ReactionRate option * ReactionRate option)>) 
    (calculateRates : 'T -> RelatedReactions<'T>)
    (r : 'T) = 

    match d.TryGetValue r with 
    | true, rates -> 
        rates
    | false, _ -> 
        updateRelatedReactions d (calculateRates r) r

函数是这样使用的:

type FoodCreationModel (p : FoodCreationParam) = 
    let rateDictionary = new Dictionary<FoodCreationReaction, (ReactionRate option * ReactionRate option)>()
    let calculateRates _ = getRates (Some p.foodCreationRate, Some 1.0) (None, None)

    member __.getRates r = 
        getRatesImpl rateDictionary calculateRates r

    member __.inputParams = p

当我在 getRatesImpl 中放置一个 break 时,它不会在 FSI 中被击中。例如,即使我在 getRates 上(在行 getRatesImpl rateDictionary calculateRates r 上)然后按 F11,FSI 也不会进入 inline getRatesImpl。但是,它确实有效,我可以通过查看字典在调用前后的变化来检查它。

其中一些内联函数非常复杂,我确实需要偶尔调试一下。

问题是如何?

您的代码可能可以更改以避免需要复杂的 inlines。

避免使用 SRTP 的一种方法是将所需函数作为参数而不是约束传递:

let getRatesImpl
        (d : Dictionary<'T, (ReactionRate option * ReactionRate option)>) 
        (getEnantiomer: 'T -> 'T)
        (calculateRates : 'T -> RelatedReactions<'T>)
        (r : 'T) = 

    match d.TryGetValue r with 
    | true, rates -> 
        rates
    | false, _ -> 
        updateRelatedReactions d getEnantiomer (calculateRates r) r

现在getRatesImpl不需要内联。

如果需要多个函数,则可以传递函数记录。