注:我将S
和I
的定义如下:https://en.wikipedia.org/wiki/SKI_combinator_calculus#Informal_description
所以S xyz = xz(yz)
,或者说在铁 rust :
fn s <Z, Y, X> (
x: fn(Z) -> fn(Y) -> X,
y: fn(Z) -> Y,
z: Z
) -> X
where Z: Copy
{
x(z)(y(z))
}
让我们再定义一个辅助I x = x
:
fn i <X> (x: X) -> X { x }
我知道S I I x
是x(x)
(我实际上试图解决的问题是找到一种x
类型,使x
适用于它自己),但让我们不要成为通用的RN,而是try 使用S I I I
.
显然,S I I I = I(I)(I(I)) = I(I) = I
let _ = s(i, i, i); // = i(i)(i(i)) = i(i) = i
这在我看来是合法的,但在编译器的眼中是不合法的:
error[E0308]: mismatched types
--> src/main.rs:45:18
|
45 | let _ = s(i, i, i);
| - ^ cyclic type of infinite size
| |
| arguments to this function are incorrect
|
note: function defined here
--> src/main.rs:32:4
|
32 | fn s <Z, Y, X> (
| ^
33 | x: fn(Z) -> fn(Y) -> X,
34 | y: fn(Z) -> Y,
| -------------
我找到了一个"解释",这个错误之所以会发生,是因为rustc无法处理某些无法计算的类型.有道理,但我在这里看不到任何上述类型的样本.你能告诉我它发生在哪里吗(如果可能的话,还有如何解决它)?