如 f: (X, Y) → (X, Y); g: (X, Y) → (X, Y). 如何做到 (x,y) |> f |> g
这种传递想要得到怎样的输出呢?
let (x, y) = (x,y) |> f |> g
这样。因为函数的类型是uncurry的,就会自然地想这么干
你想要的,应该是这样?
fn swap[A, B](pair: (A, B)) -> (B, A) {
let (a, b) = pair
(b, a)
}
test {
((1, 2) |> swap |> swap |> @assertion.assert_eq((1, 2)))?
}
这里如果是
fn swap[A,B](a: A, b: B) -> (B, A) { ... }
函数类型是 forall A B, A → B → (B, A) 还是 forall A B, (A, B) → (B, A)?
MoonBit的函数参数不是一整个tuple,所以这里函数的类型既不是A->B->(B,A)
,也不能算是这里讨论的(A,B)->(B,A)
,虽然类型签名的显示效果刚好是一样的。目前pipe暂时也不支持传递多个参数。