2016-12-12 31 views
6

W kursie programowania funkcjonalnego coursera natknąłem się na subtelną koncepcję.Podpisywanie między typami funkcji

Jeśli A2 <: A1 i B1 <: B2, następnie (A1 => B1) <: (A2 => B2)

Uzasadnienie

  • kiedy przekazujemy argument do A2 i ze względu na relację podtypu możemy przekazać ten sam argument do A1.
  • następnie zastosować funkcję A1 => B1
  • Wtedy ta funkcja daje B1 i ze względu na podtypy, które kwalifikuje się jako B2

Jeśli narysować diagram Venna dla tego,

  • schemat 1 diagram 1

  • schemat 2 diagram 2

    • Jaki jest prawidłowy schemat tego?
    • Jak można wyjaśnić wynik za pomocą diagramu Venna?

referencyjny: Youtube video

Dzięki wezwanie

Odpowiedz

4

Miejmy (A1 => B1) dla F1 i (A2 => B2) dla F2

dla funkcji F1 do być podtypem innej funkcji F2, potrzebujemy systemu typu, aby zaakceptować go w miejsce F2.

Możesz przekazać dowolny podtyp argumentu A do funkcji, która akceptuje A, ale nie ma nadnaturalnego. Oznacza to, że aby F1 był podtypem F2, musi zaakceptować co najmniej wszystko, co F2 przyjmuje jako argument, stąd A1 musi być nadtypem A2.

Wyjście F1, z drugiej strony, musi być co najmniej tak szczegółowe jak wyjście F2, aby można było go używać wszędzie tam, gdzie można wykorzystać wyjście F2. Oznacza to, że B1 musi być podtypem B2.

Nie jestem pewien, czy diagramy są dobrym sposobem wizualizacji tego, jak to pasuje, ale powiedziałbym, że z dwóch, schemat 1 jest najdokładniejszy. wygląd

Miejmy na przykład: Powiedzmy, że masz funkcję f1(s: Set): Set Następnie f2(s: Iterable): SortedSet jest podtypem f1, ponieważ może on być stosowany w miejsce f1.

f1 wymaga podania argumentów typu Set lub dowolnego podtypu Set. Wszystkie te argumenty są również ważne w f2. Wyjście f1 jest Set, więc wyjście F2 musi być użyteczny jako Set. Od SortedSet jest podtypem Set, to też prawda.