如何将Ceylon Sequential或数组转换为具有适当类型的通用元组?

时间:2015-12-06 21:21:21

标签: ceylon

我有一个泛型函数,需要创建一个元组来调用一个函数,该函数的参数我不知道它的类型。

这样的东西(本例中的array除外是由一些外部代码创建的,所以我不能直接应用这个函数):

Result apply<Result, Where>(
    Anything[] array, 
    Callable<Result, Where> fun)
        given Where satisfies Anything[] => nothing;

是否有一种类型安全的方法来实现此方法并使用给定的参数调用函数?

2 个答案:

答案 0 :(得分:2)

这不能完全类型安全地完成...但是假设数组确实包含正确类型的元素,因为它们应该出现在Where类型的元组中,以下函数将起到作用: / p>

Tuple<Anything, Anything, Anything> typedTuple({Anything+} array) {
    if (exists second = array.rest.first) {
        return Tuple(array.first, typedTuple({ second }.chain(array.rest.rest)));
    }
    else {
        return Tuple(array.first, []);
    }
}

并将apply实现为:

Result apply<Result, Where>(
    [Anything+] array, 
    Callable<Result, Where> fun)
        given Where satisfies Anything[] {
    value tuple = typedTuple(array);
    assert(is Where tuple);
    return fun(*tuple);
}

答案 1 :(得分:0)

array的类型与fun的参数没有任何关系,因此签名不可能以类型安全的方式实现。你根本不限制array的类型;它可以包含任何东西。原则上,类型安全的实现如何处理fun期望[String, Integer]array[Boolean+]的情况?