管道能传多个参数吗?

如 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暂时也不支持传递多个参数。