Используйте 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
, значит, так и есть.