F#: проблема с перегрузкой карри/кортежом

При переносе некоторого кода на последнюю версию F#, включенную в VS2010 b1, я столкнулся с проблемой и хотел бы знать, есть ли доступный обходной путь, а если нет, то почему поведение компилятора F# было изменено, чтобы не поддержать сценарий.


type Foo(a) =
    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq) otherParm = method impl...

    //this overload exists for better compatibility with other languages
    [<OverloadID("TupledAbc")>]
    member public x.Abc (p:Dictionary<oneType, anotherType>, otherParm) =
        x.Abc(p |> Seq.map(fun kvp -> (kvp.Key, kvp.Value))) otherParm

Этот код выдает следующую ошибку времени компиляции:

error FS0191: One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form

Обратите внимание, что раньше это работало безупречно на F# 1.9.6.2 (сентябрьская CTP)


person em70    schedule 28.05.2009    source источник


Ответы (1)


Причина изменения указана в подробные примечания к выпуску:

Оптимизация каррированных методов

Каррированный член выглядит так:

тип С() =

static member Sum a b = a + b    

В предыдущих реализациях F# каррированные члены компилировались менее эффективно, чем некаррированные члены. Теперь это было изменено. Однако теперь есть некоторые небольшие ограничения на определение каррированных членов:

  • каррированные члены не могут быть перегружены
  • некоторые определения каррируемых элементов могут нуждаться в корректировке, чтобы добавить в определение правильное количество параметров.

Поскольку ваша перегрузка может быть разрешена только для первого параметра, вы сможете обойти ее, изменив каррированную версию на:

    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq)
       = fun otherParm -> method impl...
person GS - Apologise to Monica    schedule 28.05.2009
comment
Спасибо, что указали на проблему с заголовком, я писал вопрос о другой проблеме, которую мне нужно было исправить, а потом возникла эта, и я просто забыл о заголовке :( P.S.: я сейчас тестирую ваше решение, чтобы увидеть, работает :D - person em70; 28.05.2009