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
。但是,它确实有效,我可以通过查看字典在调用前后的变化来检查它。
其中一些内联函数非常复杂,我确实需要偶尔调试一下。
问题是如何?
您的代码可能可以更改以避免需要复杂的 inline
s。
避免使用 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
不需要内联。
如果需要多个函数,则可以传递函数记录。
我有几个通用的内联函数,例如:
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
。但是,它确实有效,我可以通过查看字典在调用前后的变化来检查它。
其中一些内联函数非常复杂,我确实需要偶尔调试一下。
问题是如何?
您的代码可能可以更改以避免需要复杂的 inline
s。
避免使用 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
不需要内联。
如果需要多个函数,则可以传递函数记录。