Re[7]: [F#] Instance methods
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 14.09.09 08:48
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, gandjustas, Вы писали:


G>>Здравствуйте, Пельмешко, Вы писали:


G>>Неправльно выразился. Там делегатов нету.

G>>Суть в том что подсовывать this в этот все равно код нету возможности.

П>В FastFunc<>? Там что угодно сгенерить можно, почему не так:

П>
П>[Serializable]
П>internal class clo@9_1 : FastFunc<string, int>
П>{
П>    public override int Invoke(String s)
П>    {
П>        return s.Length;
П>    }
П>}
П>
Вот Вам и функциональный тип из instance-метода, с подменой this, лямбда fun s -> s.Length то же самое сгенерит


Теперь понял о чем речь.
Только зачем усложнять компилятор (кто знает что потянет за собой такая фича), если можно просто писать fun s -> s.Length?
Re[8]: [F#] Instance methods
От: Пельмешко Россия blog
Дата: 14.09.09 09:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Только зачем усложнять компилятор (кто знает что потянет за собой такая фича), если можно просто писать fun s -> s.Length?


Можно, конечно
Просто, знакомясь с F# и вообще ФП, я ожидал некой однородности языка плане функциональных типов...
Я абсолютно был уверен, что instance-метод можно рассматривать как функциональный тип, и ожидал какой-нибудь синтаксис для этого...

Ненаю, наверное я неправильно думаю...
Re[9]: [F#] Instance methods
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.09.09 10:17
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Просто, знакомясь с F# и вообще ФП, я ожидал некой однородности языка плане функциональных типов...

В старых версиях в F# был свой стандартный модуль string. Я его успел застать только по литературе, потому слабо представляю, что там было и по каким причинам они перешли на стандартную строку.

П>Я абсолютно был уверен, что instance-метод можно рассматривать как функциональный тип, и ожидал какой-нибудь синтаксис для этого...

Я тоже ожидал. Но тут даже не в instance-методах дело. Статические методы не F# тоже не функциональные типы.

П>Ненаю, наверное я неправильно думаю...

наверное, я тоже. Тоже хотелось бы каких-нибудь автогенерированных оберток над обычными методами, чтобы можно было частичное применение делать, и т.п.
Re[4]: [F#] Instance methods
От: Kluge  
Дата: 18.09.09 09:36
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Пельмешко, Вы писали:

П>>Почему бы не разрешить подобное на уровне компилятора в F# для reference-типов?
MC>Т.е. встроить в язвк шорткат для fun s -> s.Method?
MC>Это как раз работа для простого макроса. Как там в F# с метапрограммированием?

П>
П>"hello"
П>|> String.Length
П>

Этот вариант вполне работает, но если бы не работал и часто встречалось
fun s -> s.Length

то шоткат можно и самому написать
let inline length a =
    (^a : (member Length: int) a)

будет ещё короче и подходить не только для строк
"hello" |> length

Это конечно не совсем то о чём спрашивалось, но в реальности мне эта возможность требовалась настолько редко, что я даже не задумывался и вполне обходился чем-нить вроде String.length

P.S. Значительно более полезным оказался кейворд function.
Лоботомию в массы! (с)
Re[5]: [F#] Instance methods
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.09.09 09:46
Оценка:
Здравствуйте, Kluge, Вы писали:

П>>
П>>"hello"
П>>|> String.Length
П>>

K>Этот вариант вполне работает, но если бы не работал и часто встречалось
Этот не работает, работает этот
"hello"
|> String.length

где String — module String from Microsoft.FSharp.Core


K>то шоткат можно и самому написать


Было бы круто, если бы их можно было не писать...
Re[6]: [F#] Instance methods
От: Kluge  
Дата: 18.09.09 11:10
Оценка:
Здравствуйте, samius, Вы писали:

K>>то шоткат можно и самому написать

S>Было бы круто, если бы их можно было не писать...
Согласен, но часто ты страдал от отсутствия это фичи? Можно написать предложение разработчикам, до беты вполне успели бы включить, но ИМХО ценность фичи слишком призрачна.
Лоботомию в массы! (с)
Re[7]: [F#] Instance methods
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.09.09 11:27
Оценка:
Здравствуйте, Kluge, Вы писали:

K>Здравствуйте, samius, Вы писали:


K>>>то шоткат можно и самому написать

S>>Было бы круто, если бы их можно было не писать...
K>Согласен, но часто ты страдал от отсутствия это фичи? Можно написать предложение разработчикам, до беты вполне успели бы включить, но ИМХО ценность фичи слишком призрачна.

Не сказать чтобы страдал, потому как воспринимал это как данное свыше. Но вот если бы такая фича была, было бы очень здорово. И хотелось бы больше — набор каррированных оберток вокруг всех мембер методов! Только боюсь, что это может вылезти какой-нибудь кривизной...

Ценность фичи действительно призрачна, пока используются библиотеки F#-а, либо ограниченный набор типов, для которых можно написать шоткаты вручную (или даже нагенерить их). Но вот на стыке со всеми другими библиотеками она немного скрасит жизнь.
Re[8]: [F#] Instance methods
От: Kluge  
Дата: 18.09.09 15:07
Оценка: +1
Здравствуйте, samius, Вы писали:

S>Не сказать чтобы страдал, потому как воспринимал это как данное свыше. Но вот если бы такая фича была, было бы очень здорово. И хотелось бы больше — набор каррированных оберток вокруг всех мембер методов! Только боюсь, что это может вылезти какой-нибудь кривизной...

+1

S>Ценность фичи действительно призрачна, пока используются библиотеки F#-а, либо ограниченный набор типов, для которых можно написать шоткаты вручную (или даже нагенерить их). Но вот на стыке со всеми другими библиотеками она немного скрасит жизнь.


Как вывод можно сказать, что "недостатки" F# это следствие его жизни внутри .NET впрочем его преимущество над OCaml в этом-же. А на стыке с любыми другими библиотка стоит от греха подальше сразу нагенерить нормальных обёрток и потом пользоватьс только ими.

Правда в некоторых случаях анализатор подкладывает сладкие плюшки вида
> let f = Int32.TryParse;;
val f : string -> bool * int

вместо
> let f = Int32.TryParse;;
val f : (string * byref int) -> bool

возможно с методами экеземпляра стоит поступать так-же, хотя какая сигнатура будет адекватной и нельзя-ли обойтись inline функцией когда это понадобилось это вопрос.
Лоботомию в массы! (с)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.