F # FSI не нажимает перерыв внутри встроенной функции - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть несколько общих встроенных функций, например:

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, он не попадаетв ФГУ.Даже если я поставлю разрыв, например, на getRates (в строке getRatesImpl rateDictionary calculateRates r) и затем нажму F11, FSI не попадет внутрь inline getRatesImpl.Однако, это работает, и я могу проверить это, посмотрев, как изменяется словарь до и после вызова.

Некоторые из этих встроенных функций довольно сложны, и мне действительно нужно время от времени отлаживать их.

Вопрос в том, как?

1 Ответ

0 голосов
/ 24 декабря 2018

Ваш код, вероятно, можно изменить, чтобы избежать необходимости в сложных 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 указывать не нужно.

Если требуется более одной функции, то можно передать запись функций.

...