2016-12-12 10 views
6

coursera関数型プログラミングコースでは、私は微妙な概念に出くわしました。関数型間のサブタイプ

場合A2 <:A1B1 <:B2、次いで(A1 => B1)<:(A2 => B2)

正当

  • 私たちはA2に引数を渡し、サブタイプの関係のために同じ引数をA1に渡すことができます。
  • 次に適用する関数A1 => B1
  • 次に、その機能がB1を与え、なぜなら私たちは、このためのベン図を描く場合はB2

としての資格をサブタイプの、

  • 図1 diagram 1

  • 図2 diagram 2

    • これは正しい図ですか?
    • このベンダイアグラムを使用して結果をどのように説明できますか?

参考:Youtube video

おかげへの関数F1のためにF2

のためのF1および(A2 => B2)のための

答えて

4

レッツ・コール(A1 => B1)別のファンクションF2のサブタイプにするには、F2の代わりにタイプシステムを受け入れる必要があります。

引数Aの任意のサブタイプを、Aを受け取り、スーパータイプを受け入れない関数に渡すことができます。これは、F1がF2のサブタイプであるためには、少なくともF2が引数として受け入れるすべてを受け入れる必要があることを意味します。したがって、A1はA2のスーパータイプでなければなりません。

一方、F1の出力は、少なくともF2の出力と同じくらい詳細でなければならないので、F2の出力を使用できる場所であればどこでも使用できます。つまり、B1はB2のサブタイプでなければなりません。

私はこの図がどのように一緒に収まるかを視覚化するのに良い方法だとは思っていませんが、2つのうち、図1が最も正確です。

は例を見てみましょう: は、あなたがそれをf1の代わりに使用することができるので、その後f2(s: Iterable): SortedSetは、f1のサブタイプである機能f1(s: Set): Set を持っていると言います。

f1の引数のタイプは、SetまたはSetのサブタイプです。これらの引数はすべてf2でも有効です。 f1の出力はSetなので、f2の出力はSetとして使用可能でなければなりません。 SortedSetSetのサブタイプであるため、これも該当します。

関連する問題