Consider this code:
BeginPackage["Test`"];
f1::usage = "";
f2::usage = "";
f3::usage = "";
Begin["`Private`"];
fQ[myf_] := Head[myf] === f1;
f1[n_][t_] := 0;
f2[myf1_?fQ, myf2_?fQ][t_] := 0;
f3[myf1_] := myf1[0.];
End[];
EndPackage[];
The expression evaluate on main kernel
f3[f2[f1[1], f1[1]]]
(*0*)
but when I evaluate on subkernels, it seems that it is not evaluated
LaunchKernels[];
DistributeDefinitions[f1, f2, f3];
ParallelEvaluate[Block[{data}, data = f3[f2[f1[1], f1[1]]];
Print[data];], (Kernels[])[[1]]]
(* (kernel 1) Test`f2[Test`f1[1],Test`f1[1]][0.]*)
Where do I do wrong?
And if I distribute the definition of the fQ
, it then get evaluated:
DistributeDefinitions[f1, f2, f3, Test`Private`fQ];
ParallelEvaluate[Block[{data}, data = f3[f2[f1[1], f1[1]]];
Print[data]], (Kernels[])[[1]]]
(* (kernel 1) 0 *)
How should I understand this behavior?