Это мое решение осуществлять от Yaht:Может ли этот образец haskell быть короче?
Упражнения 4.6 Напишите тип данных Tuple который может содержать один, два, три или четыре элемента, в зависимости от конструктора (то есть, должно быть четыре Конструкторов , по одному для каждого числа аргументов). Также предоставляйте функции tuple1 через tuple4, которые берут кортеж и возвращают только значение в этом положении, или ничего, если число в действии (т. Е. , вы запрашиваете кортеж4 на кортеже, состоящем только из двух элементов).
Когда я написал первую строчку, я был в восторге от простоты по сравнению с 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; -- }
В C# я могу получить доступ к любому полю без проблем, но здесь я должен написать «функцию доступа», не так ли? И количество кода здесь меня огорчает.
Могу ли я иметь более короткий код здесь?
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 один из C# преимуществ здесь, может быть, по сравнению с Nullable. В C# у нас есть специальный синтаксис (?postfix) и полностью прозрачное (но все же необязательно контролируемое) преобразование между T? и T (int и int). Даже во время распаковки я могу иметь объект x = 5; var y = (int?) x. Не упоминание о ненужном преобразовании из int b = 5; к int? c = b; –
О, так много ответов и путей ... И знаешь что? Ничто не является достаточно удобочитаемым, если принять во внимание то количество знаний, которое автор дает в YAHT в этом упражнении, за исключением первого ответа Даниэля ... Конечно, дальнейшее чтение может принести некоторый свет на «где» или «>> =» или '> =>' ... Но даже этот ответ довольно сложный, я думаю, я бы не догадался, что сам по себе кажется сложным :) Спасибо за ответы много. –