typesは指定された型をすべて満たす型です。言葉による説明よりもコードを見てもらった方がわかりやすいと思います。みたいな感じですかね。これは素直に理解できました。関数の型付けで考えたときに混乱してしまいました。返す関数の型について考えてみます。1つの関数で複数の引数パターンに対応することになるので、関数のオーバーロードということになります。つないであげれば良さそうです。Error!エラーが出てしまうんです。引数として取る関数の型が含まれているんだから、推論によってAが選ばれるだろう、と考えていたのですが、どうやらそういう理屈ではないようです。Bかわからん」という型です。入ってる」とも言ってません。呼び出し時点ではどちらの関数が格納されているのか確定できないからエラーになっている、というわけです。これだけ丁寧に説明してもらっても最初はわからなかった。いうことで、さらにもらったヒントは関数にするからわかりにくいので、関数以外で考えてみて、でした。Error!これはもう悩むまでもなく「当たり前じゃん!」って思っていたんですが、その理解が浅かった。呼び出し可能かチェックされる。存在しないのでエラーとなっている。イメージに反しますよね。どれか1つ満たせばいいはずなのに、型が確定していないから全部満たしているかチェックされてしまう。types)に対して呼び出すには、どちらの型が入っていても問題ないように呼び出し可能かチェックする部分で引っかかっていたわけです。関数オーバーロードを考えるさて、この話をした上で、改めて関数バージョンを見てみる。引数とする関数なのかわからない。わからないのでどちらの関数が入っていても問題なく呼び出し可能かを保証するために、取り得るすべての型について呼び出しを満たしているかチェックしに行く。引数に取っているので満たしていない。それでエラーが発生する。typesの話が出てくる前の段階でつまづいているってことです。いう型定義であっても呼び出し時点でどっちか確定しているなら呼び出すことが可能になる。