(* 反変ベクトル, 共変ベクトル *) type vector = | Variant of float array | Covariant of (float array -> float) (* テンソル : 反変ベクトル, 共変ベクトルのテンソル積 *) type tensor = | Vector of vector | Tensor of vector list let ( @ ) x y = match x, y with | Vector x, Vector y -> Tensor (List.append [x] [y]) | Vector x, Tensor y -> Tensor (List.append [x] y) | Tensor x, Vector y -> Tensor (List.append x [y]) | Tensor x, Tensor y -> Tensor (List.append x y) exception InvaridDual let dual_coupling_vector x y = match x, y with | Variant x, Covariant y -> y x | Covariant x, Variant y -> x y | _, _ -> raise InvaridDual let rec dual_coupling_vector_list x y = match x, y with | [x], [y] -> dual_coupling_vector x y | x :: xs, y :: ys -> (dual_coupling_vector x y) *. (dual_coupling_vector_list xs ys) | _, _ -> raise InvaridDual let dual_coupling x y = match x, y with | Vector x, Vector y -> dual_coupling_vector x y | Tensor s, Tensor t -> dual_coupling_vector_list s t | _, _ -> raise InvaridDual