Використовуйте GHC 7.10
Перша версія GHC, яка містила цей матеріал, була випущена 27 березня 2015 року .
Це остання версія, а Prelude отримав кілька нових доповнень, корисних для гри в гольф:
(<$>)
І (<*>)
оператори
Ці корисні оператори Data.Applicative
зробили це! <$>
це просто fmap
, так що ви можете замінити map f x
і fmap f x
з f<$>x
скрізь і відігравати байти. Також <*>
корисний в Applicative
екземплярі для списків:
Prelude> (,)<$>[1..2]<*>"abcd"
[(1,'a'),(1,'b'),(1,'c'),(1,'d'),(2,'a'),(2,'b'),(2,'c'),(2,'d')]
(<$)
оператор
x<$a
еквівалент fmap (const x) a
; тобто замініть кожен елемент контейнера на x
.
Це часто приємна альтернатива replicate
: 4<$[1..n]
коротше, ніж replicate n 4
.
Складна / Прохідна пропозиція
Наступні функції були зняті з роботи над списками [a]
до загальних Foldable
типів t a
:
fold*, null, length, elem, maximum, minimum, sum, product
and, or, any, all, concat, concatMap
Це означає, що вони зараз також працюють над тим Maybe a
, де вони поводяться так само, як "списки з максимум одним елементом". Наприклад null Nothing == True
, або sum (Just 3) == 3
. Аналогічно length
повертає значення 0 для Nothing
та 1 для Just
значень. Замість написання x==Just y
можна писати elem y x
.
Ви також можете застосувати їх до кортежів, що працює так, ніби ви зателефонували \(a, b) -> [b]
першими. Це майже повністю марно, але or :: (a, Bool) -> Bool
на один символ коротше snd
і elem b
коротше (==b).snd
.
Функції Monoid mempty
іmappend
Не часто рятує життя, але якщо ви можете зробити висновок про тип, mempty
це на один байт коротше Nothing
, так ось це.