 Functions that have the same domain and codomain may be quite different, however, by abstraction, they are of the same sort or type. As a simple illustration, let \(f_1\) and \(f_2\) be two functions defined as \(f_1= \lambda x.\,8\cdot x\) and \(f_2=\lambda x.\,x/3\). If \(x\) is a variable  ranging over reals, then \(f_1\) and \(f_2\) have the same domain and codomain (i.e., they have the same type \(\mathbb{R}\rightarrow\mathbb{R}\)), although \(f_1\ne f_2\), because \(f_1(x)\ne f_2(x)\) whenever \(x\ne0\). The usual notation to indicate that a function \(f\) has \(A\) as its domain and \(B\) as its codomain is \(f\colon A\rightarrow B\). It is a happy coincidence that nowadays ‘\(\rightarrow\)’ is often used in logics as a symbol for entailment or (nonclassical) implication.