Бессмысленный стиль с объектами / записями в F # - PullRequest
3 голосов
/ 03 июня 2009

Меня сбивает с толку то, как «точечная нотация» работает с объектами и записями, когда я пытаюсь программировать в бессмысленном функциональном стиле (который я считаю отличным и кратким способом использовать функциональный язык, который по умолчанию карри ).

Есть ли пропущенный оператор или функция, которая позволяет мне делать что-то вроде: (.) object method вместо object.method?

(Из того, что я читал о новом операторе ?, я думаю, что он работает следующим образом. За исключением того, что он требует определения и затрагивает всю динамическую привязку, которая, как мне кажется, мне не нужна.)

Другими словами, могу ли я применить метод к его объекту в качестве аргумента, как если бы я применил к его аргументу обычную функцию?

Ответы [ 2 ]

5 голосов
/ 03 июня 2009

Краткий ответ: нет.

Более длинный ответ: вы, конечно, можете создавать функции с привязкой к элементам в модуле, которые вызывают метод для данного типа ... Например, в коде

let l = [1;2;3]
let h1 = l.Head 
let h2 = List.hd l

в определенном смысле "List.hd" - это версия того, что вы хотите для ".Head on a list". Или на месте, вы всегда можете сделать, например,

let AnotherWay = (fun (l:list<_>) -> l.Head)
let h3 = AnotherWay l

Но в этом нет ничего общего, поскольку нет хорошего способа «назвать» метод произвольного экземпляра для данного типа; AnotherWay показывает способ «сделать функцию из свойства« Head »объекта« list <_> », но вам нужен такой шаблон для каждого метода экземпляра, который вы хотите рассматривать как значение функции первого класса.

Я предложил создать языковую конструкцию для обобщения этого:

Что касается языкового дизайна предложения, что если

 SomeType..Foo optArgs   // note *two* dots 

означает

 fun (x : SomeType) -> x.Foo optArgs 

В таком случае вы могли бы написать

list<_>..Head

как способ «функционализировать» это свойство экземпляра, но если мы когда-нибудь что-нибудь сделаем на этой арене в F #, это будет после VS2010.

2 голосов
/ 03 июня 2009

Если я правильно понимаю ваш вопрос, ответ: нет, вы не можете. Точка (.) Не является оператором в F #, она встроена в язык, поэтому не может использоваться как функция.

...