Я пытаюсь использовать List.fold для типа записи, который определяет перегрузку оператора для +
, но я получаю ошибку несоответствия типов при попытке использовать оператор (+)
, поскольку лямбда-выражение передается для свертывания,Вот упрощенный фрагмент, который иллюстрирует мою проблему:
// a record type that also includes an overload for '+'
type Person =
{ Name : string; Age: int }
static member ( + ) (x: Person, y: Person) = x.Age + y.Age
перегрузка +
прекрасно работает
> jen + kevin;;
val it : int = 87
, но, скажем, у меня есть список людей:
> let people = [kevin;jen];;
Я не могу использовать List.fold для суммирования всех возрастов:
> List.fold (+) 0 people;;
List.fold (+) 0 people;;
----------------^^^^^^
error FS0001: Type constraint mismatch. The type
int
is not compatible with type
Person
The type 'int' is not compatible with the type 'Person'
Я предполагаю, что проблема в том, что F # не может распознать перегрузку +
при передаче вэтот способ, так как fold неявно печатает список на int
, потому что я использовал '0' в качестве аккумулятора.Я не уверен, возможно ли заставить мою пользовательскую перегрузку оператора работать правильно, и если это возможно, то, чего мне не хватает, чтобы это произошло.(Я предполагаю, что это возможно сделать, потому что вы можете использовать +
для чисел с плавающей запятой).
edit
Я понимаю, что проблема заключается в несоответствии типов.Как пишет JaredPar, я понял, что могу написать лямбду, чтобы взять записи двух человек и добавить возраст.Это не моя точка зрения.Проблема в том, что мне кажется, что должен быть способ получить перегрузку оператора +
, которую я уже написал, чтобы она была подтверждена Fold как допустимая перегрузка.
другое редактирование
Спасибо всем за ваш вклад.Одна вещь, которая становится ясной, это то, что не невозможно делать то, что я хочу, но это нормально.Я кое-что узнал!Я вижу, что разрешение перегрузок операторов таково, что они не работают во всех контекстах, поэтому с fold
не существует бесшовного способа сделать +
переданным как лямбдаработать так же, как и при использовании в качестве инфикса аля jen + kevin
.Это имеет полный смысл, почему это не работает правильно.Решения, которые люди предложили для решения этой проблемы, в основном являются однократными и решают конкретную проблему fold
- я действительно хочу узнать, как получить правильную перегрузку оператора для выбора каждые ситуация (т. е. foldback
и т. д.) - мне не хотелось писать кучу кода специального случая для работы со списками.Совершенно ясно, не то, что разрешение перегрузки оператора F # имеет некоторые ограничения, которые заставляют его работать на уровне скинов, и это нормально.