5

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

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

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

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

4

2 回答 2

2

这不能完全类型安全地完成......但假设数组确实包含正确类型的元素,因为它们应该出现在 type 的 Tuple 中Where,下面的函数可以解决问题:

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, []);
    }
}

并且应用被实现为:

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);
}
于 2015-12-08T19:03:15.160 回答
0

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

于 2015-12-07T23:12:46.647 回答