Код ниже претендует на работоспособность на моей машине.
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;
using System;
using System.Console;
[Record]
class X[T]
{
public Value : T;
public static @: (value : T) : X[T] { X(value) }
public override ToString() : string { Convert.ToString(Value) }
}
[Record]
class Y
{
public Value : object;
public static @: [T](value : T) : Y { Y(value) }
public override ToString() : string { Convert.ToString(Value) }
}
module Program
{
Main() : void
{
mutable a : X[_] = 1;
WriteLine(a);
mutable b : Y = 1;
WriteLine(b);
_ = ReadLine();
}
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Как на немерли будет конструктор присвоения?
От:
Аноним
Дата:
01.12.13 07:34
Оценка:
Здравствуйте, hardcase, Вы писали:
mutable x=0;
WriteLine(x);
x = x:X[int];
expected int, got Program.X[int] in assigned value: Program.X.[T] is not a subtype of System.Int32 [simple require] c:\users\сергей\documents\visual studio 2012\Projects\MacroLibrary2\ConsoleApplication1\Main.n 32 9 ConsoleApplication1
не работает, в то время как
mutable x:X[_]=0;
WriteLine(x);
x = x:X[int];
Вполне работоспособен
Ошибка вывода типов?
Re[5]: Как на немерли будет конструктор присвоения?
Здравствуйте, Аноним, Вы писали:
А>Ошибка вывода типов?
Не ошибка, а принцип. Принцип такой что как только компилятор типизирует сверху вниз слева на право. И как только есть достаточно информации чтобы вывести тип, он выводит самый конкретный из возможных.
В первой строке x получает тип int.
Re[5]: Как на немерли будет конструктор присвоения?
А> mutable x=0; // Тут компилятор предполагает что x может быть int
А> WriteLine(x); // Здесь пока откладываем типизацию
А> x = x:X[int]; // Здесь говорим что x это X[int]
А>
Далее компилятор пытается совместить int и X[int].
Это у него конечно не выходит , типы не совместимые.
А>не работает, в то время как А>
А> mutable x:X[_]=0; // Возможно X[что-то]
А> WriteLine(x);
А> x = x:X[int]; // X[int]
А>
X[что-то] и X[int] совместимы и получаем X[int].
Для новой переменной тип выведется без проблем:
mutable x=0;
WriteLine(x);
def y = x : X[_]; // y : X[int]
P.S.
Код вида "x = x : SomeType;" скорее всего не будет у вас встречаться.
В 99% случаев используется 'def', а если mutable то обычно без приведения типа на самого себя.
Здравствуйте, Аноним, Вы писали:
А>Это номально, что механизм вывода типов зависит от порядка инициализации?
От порядка инициализации чего?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: Как на немерли будет конструктор присвоения?
От:
Аноним
Дата:
02.12.13 09:39
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>Это номально, что механизм вывода типов зависит от порядка инициализации?
H>От порядка инициализации чего?
mutable x;
x = x:X[_];
x=1;
Компилируется нормально
mutable x;
x=1;
x = x:X[_];
Выдает ошибку.
Ошибка1 expected int-, got Program.X[int-] in assigned value: common super type of types [int, Program.X[int-]] is just `object', please upcast one of the types to `object'
т.е. вывод типов работает по разному.
Это нормально? Так задумано?
Re[9]: Как на немерли будет конструктор присвоения?