вывод типов не срабатывает
От: _Claus_  
Дата: 23.12.11 00:48
Оценка:
в указанном фрагменте
     def fieldTypes(ty : TypeInfo) // без ": TypeInfo" не работает - ошибка!!
        def fields = match (ty)
          
          | ty is TypeBuilder =>               
            ty.GetParsedMembers().OfType.[ClassMember.Field]().Select(f => typer.BindFixedType(f.ty).TypeInfo)              
                             
          | _ => ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance)\
                    .Select(x => x.GetMemType().TypeInfo)          
        
        fields.Where(_ != null)
        
      def isPrimitiveValue(ty)                          
        
        ty.IsValueType && (ty.IsPrimitive || fieldTypes(ty).All(isPrimitiveValue)) //ошибку дает здесь - 
            //error : in argument #2 (predicate), needed a System.Func[Nemerle.Compiler.TypeInfo-, bool],
            // got Nemerle.Compiler.TypeBuilder+ -> ?: Nemerle.Compiler.TypeBuilder+ -> ? is not a subtype 
            //of System.Func[Nemerle.Compiler.TypeInfo-, bool] [simple require]

      
      def ti = typer.BindFixedType(fld_type)            
      if (isPrimitiveValue(ti.TypeInfo))       //использую только явно давая TypeInfo
         ...


не знаю, ошибка ли это, но интуиция подсказывает, что вывод должен быть, запутаться вроде негде.
Re: вывод типов не срабатывает
От: hardcase Пират http://nemerle.org
Дата: 23.12.11 07:59
Оценка: +1
Здравствуйте, _Claus_, Вы писали:

_C_>не знаю, ошибка ли это, но интуиция подсказывает, что вывод должен быть, запутаться вроде негде.


По мне так типы и без фейла вывода прописать в этом коде просто необходимо.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: вывод типов не срабатывает
От: _Claus_  
Дата: 23.12.11 11:51
Оценка:
H>По мне так типы и без фейла вывода прописать в этом коде просто необходимо.

Зачем? Да и вопрос в другом — правомерна ли ошибка?
Re: вывод типов не срабатывает
От: catbert  
Дата: 23.12.11 15:48
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>не знаю, ошибка ли это, но интуиция подсказывает, что вывод должен быть, запутаться вроде негде.


Пишите, пожалуйста, текст ошибки. Ведь не всем хочется для этого думать, как же скомпилировать ваш код.
Re[2]: вывод типов не срабатывает
От: _Claus_  
Дата: 23.12.11 17:12
Оценка:
C>Пишите, пожалуйста, текст ошибки. Ведь не всем хочется для этого думать, как же скомпилировать ваш код.

не вопрос


module Test
    public Former(e : PExpr, typer : Typer) : void
          
      mutable fld_type
      
      match (e)
      
        | <[ $(name : name) : $type ]> =>  fld_type = type
        | _ =>  {}
      
      def fieldTypes(ty :TypeInfo) //здесь проблема, если убрать TypeInfo!
        def fields = match (ty)
          
          | ty is TypeBuilder =>               
            ty.GetParsedMembers().OfType.[ClassMember.Field]().Select(f => typer.BindFixedType(f.ty).TypeInfo)              
                             
          | _ => ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance)\
                    .Select(x => x.GetMemType().TypeInfo)          
        
        fields.Where(_ != null)
        
      def isPrimitiveValue(ty)                          
        
        ty.IsValueType && (ty.IsPrimitive || fieldTypes(ty).All(isPrimitiveValue))
        
      def ti = typer.BindFixedType(fld_type)            
      when (isPrimitiveValue(ti.TypeInfo)) {}
Re[2]: вывод типов не срабатывает
От: _Claus_  
Дата: 23.12.11 21:09
Оценка:
C>Пишите, пожалуйста, текст ошибки. Ведь не всем хочется для этого думать, как же скомпилировать ваш код.

сама ошибка :
error : in argument #2 (predicate), needed a System.Func[Nemerle.Compiler.TypeInfo-, bool],
got Nemerle.Compiler.TypeBuilder+ -> ?: Nemerle.Compiler.TypeBuilder+ -> ? is not a subtype
of System.Func[Nemerle.Compiler.TypeInfo-, bool] [simple require]
Re[3]: вывод типов не срабатывает
От: CodingUnit Россия  
Дата: 24.12.11 05:22
Оценка:
Здравствуйте, _Claus_, Вы писали:


_C_>
_C_>module Test
_C_>    public Former(e : PExpr, typer : Typer) : void
          
_C_>      mutable fld_type
      
_C_>      match (e)
      
_C_>        | <[ $(name : name) : $type ]> =>  fld_type = type
_C_>        | _ =>  {}
      
_C_>      def fieldTypes(ty :TypeInfo) //здесь проблема, если убрать TypeInfo!
_C_>        def fields = match (ty)
          
_C_>          | ty is TypeBuilder =>               
_C_>            ty.GetParsedMembers().OfType.[ClassMember.Field]().Select(f => typer.BindFixedType(f.ty).TypeInfo)              
                             
_C_>          | _ => ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance)\
_C_>                    .Select(x => x.GetMemType().TypeInfo)          
        
_C_>        fields.Where(_ != null)
        
_C_>      def isPrimitiveValue(ty)                          
        
_C_>        ty.IsValueType && (ty.IsPrimitive || fieldTypes(ty).All(isPrimitiveValue))
        
_C_>      def ti = typer.BindFixedType(fld_type)            
_C_>      when (isPrimitiveValue(ti.TypeInfo)) {}
  
_C_>


Разбирая ошибку, я вижу она возникает в двух местах
when (isPrimitiveValue(ti.TypeInfo))


и

fieldTypes(ty).All(isPrimitiveValue))


во втором случае ошибка довольно ясная in argument #1 (ty), needed a Nemerle.Compiler.TypeBuilder+, got Nemerle.Compiler.TypeInfo: Nemerle.Compiler.TypeInfo is not a subtype of Nemerle.Compiler.TypeBuilder [simple require]
то есть в аргументе ty он выводит самостоятельно TypeBuilder а дают TypeInfo, поэтому и ругается невозможно привести базовый тип к конкретному. Честно говоря до конца непонятно почему он фиксирует его как TypeBuilder, видимо потому что указано is TypeBuilder, хотя внешнее использование функции работает с TypeInfo, это какая то эвристика вывода в алгоритме вывода типов. Интересно что Влад поэтому поводу скажет он занимался алгоритмом типизации паттернов.

PS: Вообще лучше использовать не индентный синтаксис, потому как интдентный не поддерживает интеллисенс подсказки, они очень много дают при понимании проблем, показывая какие типы выводятся и подчеркивая неверные места.
Re[4]: вывод типов не срабатывает
От: CodingUnit Россия  
Дата: 24.12.11 05:24
Оценка:
Здравствуйте, CodingUnit, Вы писали:

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



CU>Разбирая ошибку, я вижу она возникает в двух местах

CU>
CU>when (isPrimitiveValue(ti.TypeInfo))
CU>


CU>и


CU>
CU>fieldTypes(ty).All(isPrimitiveValue))
CU>


CU>во втором случае ошибка довольно ясная in argument #1 (ty), needed a Nemerle.Compiler.TypeBuilder+, got Nemerle.Compiler.TypeInfo: Nemerle.Compiler.TypeInfo is not a subtype of Nemerle.Compiler.TypeBuilder [simple require]


ошибся не во втором а в первом случае
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.