а вот кажется ещё ошибка с Generic-ками
От: AngeL B. Россия  
Дата: 16.06.07 19:44
Оценка:
По мотивам обсуждения про перегрузку операторов, решил повозиться с функциями высшего порядка и наткнулся вот на такую ошибку времени выполнения.

using System.Console;

public module FuncHelper
{
    public Pipe(fab : int->int, fbc : int->void) : int->void
    {
        match( fab : object ) {
            | fa is void->int => (_ => fbc(fa()));
            | _ => (x : int => fbc(fab(x)));
        }
    }
}

public module FuncHelper2
{
    public Pipe[A, B, C](fab : A->B, fbc : B->C) : A->C
    {
        match( fab : object ) {
            | fa is void->B => (_ => fbc(fa()));
            | _ => (x : A => fbc(fab(x)));
        }
    }
}

def d2i( x : int ) : int { x+1; }
def print( x : int ) : void { WriteLine(x); }

//1
def f =    match( d2i : object ) {
        | fa is void->int => (_ => print(fa()));
        | _ => x : int => print(d2i(x));
    };

f(6);

//2
def f = FuncHelper.Pipe(d2i, print);
f(7);

//3
def f = FuncHelper2.Pipe.[int, int, void](d2i, print);
f(8);


Характерно, что код всех трех случаев в общем-то делает одно и то же. Но в первых двух на экран выводяться 7 и 8 соответственно, а в третьем случае генерируется ошибка обращения к памяти.

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