Source: https://w3.cs.jmu.edu/lam2mo/cs432_2018_08/files/07-type_visitors.pdf