Podczas tworzenia klienta interfejsu API sieci Web w języku C # napotkałem problem dotyczący null
wartości, która reprezentowałaby dwie różne rzeczy:
- nic , np.
foo
może mieć lub może nie miećbar
- nieznany : domyślnie odpowiedź API zawiera tylko podzbiór właściwości, musisz wskazać, które dodatkowe właściwości chcesz. Tak nieznany oznacza, że właściwość nie była wymagana od API.
Po kilku poszukiwaniach dowiedziałem się o typie Może (lub Opcji), w jaki sposób jest on używany w językach funkcjonalnych i jak „rozwiązuje” problemy zerowania dereferencji, zmuszając użytkownika do myślenia o możliwym braku wartości. Jednak wszystkie zasoby natknąłem mówił o wymianie NULL z Może . Znalazłem kilka wzmianek o trójwartościowej logice , ale nie do końca ją rozumiem i przez większość czasu wspomniano o niej w kontekście „to zła rzecz”.
Zastanawiam się teraz, czy sensownie jest mieć zarówno wartość zerową, jak i Być może odpowiednio reprezentować nieznane i nic . Czy to logika trójwartościowa, o której czytam, czy też ma inną nazwę? A może zamierzony sposób na zagnieżdżenie „Może w być”?
M M x
i M x
powinno mieć tę samą semantykę.
Maybe a
jest taka sama jak , semantycznie, jest taka sama jak , a izomorficzne do pisania z @Andej odpowiedź. Możesz również zdefiniować własną instancję monady dla tego typu, a zatem użyć różnych kombinatorów monad. a + 1 + 1Maybe Maybe a
UserInput a
M (M x)
i M x
powinien mieć tę samą semantykę”. Weźmy M = List
na przykład: listy list nie są tym samym, co listy. Kiedy M
jest monada, jest transformacja (czyli mnożenie monada) od M (M x)
do M x
co wyjaśnia relacje między nimi, ale oni nie mają „te same semantyki”.
null
. Jest to całkowicie zepsuty pomysł.