Как создать новый оператор '=??' для привязок полей в F#?

Я думаю, что это просто, но я не могу этого понять.

Я хочу создать нового оператора, например. (=??) , который можно использовать как '=' для привязок полей свойств. То есть новый оператор будет использоваться следующим образом:

MyProperty =?? NewValue

Я хотел бы, чтобы оператор (=??) выполнял Option.get NewValue, чтобы либо вернуть значение в MyProperty, либо немедленно завершить работу, если NewValue не имеет опции none.

Можно ли это сделать на F#??

Спасибо за ваше внимание.

Приложение:

Я до сих пор не могу понять это правильно. Например:

Предположим, что запись под названием «пациент» инициализирована как:

{Patient.RefId = Guid.NewGuid(); PatientAccountId = m.PatientAccountId; LastName = m.LastName; FirstName = m.FirstName; Mi = m.Mi; 
                 BirthDate = m.BirthDate}

Теперь, когда запись пациента определяет дату рождения как строку, но m.Birthdate является строковым параметром, поэтому назначение:

BirthDate = m.BirthDate 

терпит неудачу.

Но если я это сделаю BirthDate = Option.get m.BirthDate все хорошо.

Итак, как бы я определил оператор, например. =??, это делает:

BirthDate = Option.get m.BirthDate`

как

BirthDate =?? m.BirthDate

ТИА

Короткий ответ: Нет.

Обратите внимание: в целом = не подразумевает присваивания где-либо в F# — речь идет о сравнении; предлагаемое имя, следовательно, будет сильно раздражать любого, кто прошел начальный этап обучения F#, чтобы читать

Ruben Bartelink 13.07.2024 23:55

Если вы не согласны с моим ПРИМЕЧАНИЕМ и считаете, что у вас действительно есть вариант использования, в котором это большая победа, возможно, стоит расширить ваш вопрос более широким примером того, как вы предполагаете использовать такой механизм (не исключено, что это может быть конкретизировано в предложении fslang, если оно имеет смысл, но в нынешнем виде не похоже, что у вас есть такая проблема?)

Ruben Bartelink 14.07.2024 00:02

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

Alan Wayne 14.07.2024 04:54

@RubenBartelink Кроме того, я просто случайно выбрал =??, не имеет значения, как оно называется. :)

Alan Wayne 14.07.2024 05:11

Попробую перефразировать ответ, возможно это поможет. = при инициализации записи — это не оператор, а элемент синтаксиса. Так что перегружать его нельзя. Я думаю, лучшее, что ты можешь сделать, это {... ; BirthDate = m.BirthDate.Value}

Martin521 14.07.2024 10:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оператор присваивания <- нельзя заменить. Операторы обычно представляют собой функции, вычисляющие значения. Не существует эквивалента перегрузки операторов присваивания C/C++ с возможностью требовать неявной передачи аргумента по ссылке и т. д. ПРИМЕЧАНИЕ.

Итак, лучший синтаксис, который вы получите:

MyProperty <- NewValue.Value

Что функционально идентично:

MyProperty <- Option.get NewValue

Стоит отметить, что если вы создаете новый объект, вы также можете инициализировать свойства как часть создания, т.е.

let myThing = Thing(args)
myThing.MyProperty <- NewValue.Value

Можно свернуть в:

let myThing = Thing(args, MyProperty = NewValue)

ПРИМЕЧАНИЕ. На самом деле существуют различные способы передачи ссылки в функцию (ищите символ подписи типа &, в том числе неявно IIRC). Так что на самом деле технически возможно приблизиться к этому. Однако я настоятельно не рекомендую делать это при обычном использовании, так как в этом случае код будет очень сложно сканировать, чтобы выявить места, где происходит мутация. Тот факт, что mutable, <- и Interlocked.Xyz(&thing, ...) — единственные места, где могут происходить мутации, является важной особенностью языка.

Думаю, я выразился несколько расплывчато. Я бы хотел, чтобы новая функция компилировалась без ошибок и аварийно завершала работу только при фактическом выполнении. например, MyProperty =??? NewValue компилируется без ошибок. Но при выполнении =??? выдает ошибку во время выполнения, когда NewValue равен none. Спасибо.

Alan Wayne 14.07.2024 00:31

См. также примечание к OP; = в инициализации не может быть переопределен таким образом. Value/Option.get оба выдадут. Вы можете сделать implicitконверсионное расширение, но это будет кошмар. Вы можете определить унарный оператор, а затем выполнить = op X (со спаем между ними) — см. Learn.microsoft.com/en-us/dotnet/fsharp/language-reference/… (но в конечном итоге это будет довольно уродливо ). Другая проблема заключается в том, что если у вас есть более одного из них в блоке кода, вам будет трудно определить, какая нулевая проверка запущена (именно поэтому рекомендуется сопоставление с образцом).

Ruben Bartelink 14.07.2024 07:42

операторы обычно представляют собой функции, которые не принимают rvalue -> Я запутался, вы имеете в виду вместо этого lvalue?

ロウリン 14.07.2024 09:07

извиняюсь за путаницу lvalue/rvalue — я перестал использовать C++ в 03, и да, я имею в виду lvalue. Пошел читать stackoverflow.com/questions/3601602/… для покаяния;)

Ruben Bartelink 14.07.2024 16:08

Другие вопросы по теме