F #: проблема с перегрузкой карри - PullRequest
5 голосов
/ 28 мая 2009

При переносе некоторого кода в последнюю версию 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

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

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

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

1 Ответ

7 голосов
/ 28 мая 2009

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

Оптимизация для карри методов

Карри выглядит так:

тип C () =

static member Sum a b = a + b    

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

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

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

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