To jest moje rozwiązanie do wykonywania z Yaht:Czy ta próbka skrótu może być krótsza?
Ćwiczenia 4.6 Napisz krotka typ danych, który może pomieścić jedną, dwie, trzy lub cztery elementy, w zależności od konstruktora (czyli nie powinno być cztery konstruktorów , po jednym dla każdej liczby argumentów). Udostępnia także funkcje od tuple1 do tuple4, które pobierają krotkę i zwracają tylko wartość w tej pozycji, lub Nic, jeśli liczba jest poprawna (tj. , żądasz tuple4 na krotce zawierającej tylko dwa elementy).
Kiedy napisałem pierwszy wiersz byłem podekscytowany prostotą w porównaniu do C#
data Tuplex a b c d = Tuple1 a | Tuple2 a b | Tuple3 a b c | Tuple4 a b c d -- class Tuplex<a,b,c,d> { -- Tuplex(a p1){ _p1 = p1; } -- Tuplex(a p1, b p2){ _p1 = p1; _p2 = p2; } -- Tuplex(a p1, b p2, c p3){ _p1 = p1; _p2 = p2; _p3 = p3; } -- Tuplex(a p1, b p2, c p3, d p4){ _p1 = p1; _p2 = p2; _p3 = p3; _p4 = p4; } -- public Nullable<a> _p1; -- public Nullable<b> _p2; -- public Nullable<c> _p3; -- public Nullable<d> _p4; -- }
W języku C# mam dostępu do żadnego pola bez problemu, ale tutaj mam napisać „funkcje dostępowe”, prawda? I ilość kodu tutaj mnie zasmuca.
Czy mogę podać tutaj krótszy kod?
tuple1 ∷ Tuplex a b c d → Maybe a tuple2 ∷ Tuplex a b c d → Maybe b tuple3 ∷ Tuplex a b c d → Maybe c tuple4 ∷ Tuplex a b c d → Maybe d tuple1 (Tuple1 a) = Just a tuple1 (Tuple2 a b) = Just a tuple1 (Tuple3 a b c) = Just a tuple1 (Tuple4 a b c d) = Just a tuple2 (Tuple1 a) = Nothing tuple2 (Tuple2 a b) = Just b tuple2 (Tuple3 a b c) = Just b tuple2 (Tuple4 a b c d) = Just b tuple3 (Tuple1 a) = Nothing tuple3 (Tuple2 a b) = Nothing tuple3 (Tuple3 a b c) = Just c tuple3 (Tuple4 a b c d) = Just c tuple4 (Tuple1 a) = Nothing tuple4 (Tuple2 a b) = Nothing tuple4 (Tuple3 a b c) = Nothing tuple4 (Tuple4 a b c d) = Just d -- unit tests prop_tx1 = tuple1 (Tuple1 4) ≡ Just 4 prop_tx2 = tuple1 (Tuple2 4 'q') ≡ Just 4 prop_tx3 = tuple2 (Tuple1 4) ≡ (Nothing ∷ Maybe Char) prop_tx4 = tuple2 (Tuple2 4 'q') ≡ Just 'q'
BTW jednym z C# zalet Oto Może w porównaniu do Nullable. W języku C# mamy specjalną składnię (?postfix) i całkowicie przezroczystą (ale nadal opcjonalnie kontrolowaną) konwersję między T? i T (int? i int). Nawet podczas rozpakowywania mogę mieć obiekt x = 5; var y = (int?) x. Nie wspominając o niepotrzebnej konwersji z int b = 5; do int? c = b; –
Och, tyle odpowiedzi i sposobów ... I wiesz co? Nic nie jest dostatecznie czytelne, jeśli weźmiemy pod uwagę ilość wiedzy, którą autor daje w YAHT w tym punkcie ćwiczeń, z wyjątkiem pierwszej odpowiedzi Daniela ... Oczywiście, dalsze czytanie może rzucić trochę światła na "gdzie" lub ">>" lub '> =>' operatorzy ... Ale nawet ta odpowiedź jest dość skomplikowana, myślę, że nie zgadłbym, że przeze mnie, wydaje się podchwytliwa :) Bardzo dziękuję za odpowiedzi. –