не компилируется код
От: AngeL B. Россия  
Дата: 05.06.07 20:06
Оценка:
не компилируется следующий код

[Record]
class A
{
  [Accessor(Len)]
  private _len : int;
}

def la = [A(1), A(2), A(3)];
def ll = [1, 2, 3];

def inlist = ll.Contains(_.Len);     //тут ошибка
def la = la.Filter(inlist);


не помогает даже явное указание типа фиктивной переменной, типа

def inlist = ll.Contains((_ : A).Len);

только ошибка уже другая. Типа в А нет поля Len

Почему?
Re: не компилируется код
От: WolfHound  
Дата: 05.06.07 20:34
Оценка: 6 (1)
Здравствуйте, AngeL B., Вы писали:

AB>не помогает даже явное указание типа фиктивной переменной, типа


AB>def inlist = ll.Contains((_ : A).Len);


AB>только ошибка уже другая. Типа в А нет поля Len


AB>Почему?


Все верно. В данном случае компилятор из _.Len создает замыкание и пытается на основе того что ll.Contains принимает int вывести типы. У него это ессно не получается.

Если написать так
def inlist = a => ll.Contains(a.Len);

те явно сказать компилятору что замыкание нужно делать из всего выражения то все компилируется.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: не компилируется код
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.07 23:48
Оценка: 10 (2)
Здравствуйте, AngeL B., Вы писали:

AB>
AB>[Record]
AB>class A
AB>{
AB>  [Accessor(Len)]
AB>  private _len : int;
AB>}

AB>def la = [A(1), A(2), A(3)];
AB>def ll = [1, 2, 3];

AB>def inlist = ll.Contains(_.Len);     //тут ошибка
AB>def la = la.Filter(inlist);
AB>


Что-то шибко извращенное.

Лучше быть проще:
[Record]
class A
{
  [Accessor(Len)]
  private _len : int;
}

def la = [A(1), A(2), A(3)];
def ll = [1, 2, 3];

def inlist(a) { ll.Contains(a.Len) }
def la = la.Filter(inlist);

Хотя, если честно, я и это с трудом понимаю .

Проще так:
def la = la.Filter(x => [1, 2, 3].Contains(x.Len));


AB>не помогает даже явное указание типа фиктивной переменной, типа


AB>def inlist = ll.Contains((_ : A).Len);


Дык а что ты тваришь то? Ты пыташся передать методу Contains функцию "x => x.Len" (именно так понимает компилятор выражение "_.Len", как его не типизируй). Естественно компилятор будет всей душой противиться этому.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: не компилируется код
От: AngeL B. Россия  
Дата: 06.06.07 06:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Если написать так

WH>
WH>def inlist = a => ll.Contains(a.Len);     
WH>


это и так понятно. Я думал в терминах частичного применения, и чересчур расширил его на целые выражения. Правильный ответ надо смотреть у VladD2
Re[3]: не компилируется код
От: WolfHound  
Дата: 06.06.07 06:43
Оценка: +1
Здравствуйте, AngeL B., Вы писали:

AB>это и так понятно. Я думал в терминах частичного применения, и чересчур расширил его на целые выражения. Правильный ответ надо смотреть у VladD2

Типа у меня ответ не правильный...
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: не компилируется код
От: AngeL B. Россия  
Дата: 06.06.07 06:44
Оценка:
Здравствуйте, VladD2, Вы писали:

AB>>def inlist = ll.Contains((_ : A).Len);

VD>Дык а что ты тваришь то? Ты пыташся передать методу Contains функцию "x => x.Len" (именно так понимает компилятор выражение "_.Len", как его не типизируй). Естественно компилятор будет всей душой противиться этому.

ВО! Это то что надо.
Я думал об этом как о частичном применении функции и потерял из вида, что в данном случае записано целое выражение с вычислением длины и затем уже вызовом функции.
Спасибо.
Re[4]: не компилируется код
От: _pk_sly  
Дата: 06.06.07 07:42
Оценка: :)))
WH>Типа у меня ответ не правильный...

правильный, но Влад — круче! 8)
Re[4]: не компилируется код
От: AngeL B. Россия  
Дата: 06.06.07 11:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, AngeL B., Вы писали:


AB>>это и так понятно. Я думал в терминах частичного применения, и чересчур расширил его на целые выражения. Правильный ответ надо смотреть у VladD2

WH>Типа у меня ответ не правильный...
Правильный, правильный!
Я просто поняло в чем дело только из ответа Влада в конце. А твой воспринял как описание как надо сделать, а не почему так....недопонял короче
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.