Вывод типов в локальной функции и match по вариантам (баг?)
От: Дьяченко Александр Россия  
Дата: 23.09.07 09:50
Оценка: 6 (1)
Вывод типов в локальной функции и match по вариантам (баг?)

Не компилируется следующее:
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Выдает следующие ошибки:
Error    1    unbound type name Option1    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    21    8    NemerleWinApp
Error    2    in argument #1 (variants) of loop, needed a list.Cons[System.Object+], got list[NemerleWinApp.Variant]: Nemerle.Core.list is not a subtype of Nemerle.Core.list.Cons [simple require]    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    25    5    NemerleWinApp

Исходя из 2 ошибки понятно что по match выводится что в параметре variants не может быть пустого списка, хотя это наверно не правильно, ведь в последний образец подходит и пустой список. Изменяем исходник следующим образом (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Option1 :: [] => ()
            | [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Но и так тоже не компилируется. Ошибка:
Error    1    unbound type name Option1    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    21    8    NemerleWinApp

Если же первый кусок изменить следующим образом (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants: list[Variant])
        {
            | Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

То все нормально компилируется.
Если match не в локальной функции, то тоже компилируется.
Так же компилируется если в первом куске Option1 заменить на Variants.Option1 (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Variants.Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Это баг или я чего-то не понял?

ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.
... << RSDN@Home 1.2.0 alpha rev. 761>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.