如何将 Ceylon Sequential 或数组转换为具有适当类型的通用元组?
How to turn a Ceylon Sequential or array into a generic Tuple with the appropriate type?
我有一个通用函数需要创建一个元组来调用一个我不知道其参数类型的函数。
类似这样的东西(除了本例中的 array
是由一些外部代码创建的,所以我不能直接应用该函数):
Result apply<Result, Where>(
Anything[] array,
Callable<Result, Where> fun)
given Where satisfies Anything[] => nothing;
是否有类型安全的方法来实现此方法并使用给定参数调用要调用的函数?
array
的类型与 fun
的参数没有任何关系,因此不可能以类型安全的方式实现签名。您根本没有限制 array
的类型;它可以包含任何东西。原则上类型安全的实现如何处理 fun
期望 [String, Integer]
但 array
是 [Boolean+]
的情况?
这不能完全以类型安全的方式完成...但是假设数组确实包含正确类型的元素,因为它们应该出现在 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);
}
我有一个通用函数需要创建一个元组来调用一个我不知道其参数类型的函数。
类似这样的东西(除了本例中的 array
是由一些外部代码创建的,所以我不能直接应用该函数):
Result apply<Result, Where>(
Anything[] array,
Callable<Result, Where> fun)
given Where satisfies Anything[] => nothing;
是否有类型安全的方法来实现此方法并使用给定参数调用要调用的函数?
array
的类型与 fun
的参数没有任何关系,因此不可能以类型安全的方式实现签名。您根本没有限制 array
的类型;它可以包含任何东西。原则上类型安全的实现如何处理 fun
期望 [String, Integer]
但 array
是 [Boolean+]
的情况?
这不能完全以类型安全的方式完成...但是假设数组确实包含正确类型的元素,因为它们应该出现在 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);
}