F # fsharp взаимодействует с библиотекой C # (CsvHelper) - PullRequest
0 голосов
/ 07 ноября 2018

Я успешно использую библиотеку CsvHelper для выполнения некоторых манипуляций с CSV в F # (то, чего мне не удалось сделать с помощью Fsharp.Data CsvProvider).

В своей документации они манипулируют заголовками через:

csv.Configuration.PrepareHeaderForMatch = header => header.Replace( " ", string.Empty );

Я пытаюсь сделать что-то похожее (меняя все заголовки на строчные), но я не понимаю, как поступить с этим делегатом.

Я пытаюсь сделать следующее, но оно не компилируется.

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

Любая помощь очень ценится.

Спасибо.


Я попытался @kaefer посоветовать назначить «PrepareHeaderForMatch», так как он является C # getter; setter;

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

Как отмечается в моем комментарии, компилятор жалуется на несоответствие типов, поскольку свойство c # ожидает:

System.Func<System.Type, string, string>

enter image description here

1 Ответ

0 голосов
/ 07 ноября 2018

Ошибка, которую вы видите, вероятно, связана с несовпадением типов или с типом функции, не поддерживающей ограничение равенства. Это потому, что выражение

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

анализируется как вызов оператора Microsoft.FSharp.Core.Operators.(=) с геттером свойства слева и определением встроенной функции справа. Вместо этого вам нужно выражение присваивания expr <- expr здесь, с вызовом установщика свойства слева:

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

В языке F # токен = является распространенным источником путаницы, поскольку в зависимости от контекста он может обозначать две разные вещи:

  • Общий оператор равенства =, как указано выше, или
  • Связывание в контексте определений значения, функции, типа или члена, например, let x = 42

Редактировать Оказывается, что ожидаемый тип рассматриваемого свойства - System.Func<System.Type, string, string>, что означает, что вам нужно предоставить дополнительный аргумент, который вы впоследствии не используете. Может быть представлен подстановочным знаком: fun _ header -> header.ToLower()

...