Подтвердить что ты не робот

Каковы преимущества таких гибких "самоидентификаторов" в F #?

В то время как я понимаю самоидентификаторы в F #, я озадачен преимуществами такой гибкости. Почему F # не поддерживает только this.Blah, так как С# делает это с этим? Я предполагаю, что некоторые люди используют его для улучшения удобочитаемости, но даже это кажется растянутым. Итак, каковы преимущества/преимущества этой языковой функции?

Для неисповеданного ниже приведен пример, который определяет самоидентификатор типа "self" и идентификатор области действия "this". Пример взят из статьи MSDN, указанной выше.

type MyClass2(dataIn) as self =
   let data = dataIn
   do
       self.PrintMessage()
   member this.PrintMessage() =
       printf "Creating MyClass2 with Data %d" data
4b9b3361

Ответ 1

Одним из небольших преимуществ является то, что вы можете использовать их для дифференцирования выражения объекта this с тем типом, который его создал:

type IExample = abstract GetAnObject : unit -> obj

type MyClass() = 
  member outer.Example1 = { new IExample with member inner.GetAnObject() = upcast inner }
  member outer.Example2 = { new IExample with member inner.GetAnObject() = upcast outer }

Потенциальная философская причина состоит в том, что похоже, что ссылка this не слишком отличается от любого другого аргумента. Если вы сможете назвать другие аргументы (вместо принудительного использования arg1, arg2 и т.д.), То почему бы вам не называть первый аргумент, как вам угодно?

Ответ 2

Единственное, что я могу придумать (и это не так) - это то, что, поскольку самоидентификатор должен явно упоминаться при вызове метода экземпляра, возможность его имени позволяет использовать что-то короче слова this. Существует много (правильного или не) желания в языках на языках FP, на которых F # основывается на лаконичности (иногда до переусердства), что могло бы спровоцировать это. В конце концов, вы заметите это желание, проявившееся в других местах в F #, где это не было бы, например. С# - назвать имена функций, такие как iteri, которые, вероятно, будут называться IterateWithIndex в С#.