C'est ma solution à l'exercice de Yaht:Est-ce que cet échantillon de haskell peut être plus court?
Exercice 4.6 Écrire un Tuple datatype qui peut contenir un, deux, trois ou quatre éléments, selon le constructeur (qui est, il devrait y avoir quatre constructeurs , un pour chaque nombre d'arguments). Fournissez également fonctions tuple1 à tuple4 qui prennent une ligne et renvoient juste la valeur dans cette position, ou Nothing si le nombre est valide (par exemple, vous demandez le tuple4 sur un tuple ne contenant que deux éléments).
Quand j'ai écrit une première ligne que je me réjouissais de simplicité comparé à 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; -- }
En C# Je peux accéder à tous les domaines sans problème, mais ici je devrais écrire un « accesseurs », non? Et la quantité de code ici me rend triste.
Puis-je avoir un code plus court ici?
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 un des avantages C# ici est peut-être par rapport à Nullable. En C# nous avons une syntaxe spéciale (?postfix) et complètement transparent (mais toujours contrôlable) entre T? et T (int? et int). Même pendant le déballage, je peux avoir l'objet x = 5; var y = (int?) x. Ne pas mentionner la conversion inutile de int b = 5; à int? c = b; –
Oh, tant de réponses et de façons ... Et vous savez quoi? Rien n'est assez lisible si l'on prend en compte une quantité de connaissances que l'auteur donne dans YAHT à ce point d'exercice, sauf pour la réponse de Daniel 1 ... Bien sûr, une lecture plus approfondie peut éclairer 'où' ou '>> =' '> =>' opérateurs ... Mais même cette réponse est assez complexe, je pense, je ne devinerais pas que par moi-même, semble difficile :) Merci pour les réponses beaucoup. –