Используйте 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.
Моноидные функции memptyиmappend
Не часто спасатель, но если вы можете определить тип, memptyна один байт короче Nothing, значит, так и есть.