What I Wish I Knew When Learning Haskell
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Char8 as C
import qualified Data.ByteString.Lazy.Char8 as CL
import qualified Data.Text.IO as TIO
import qualified Data.Text.Lazy.IO as TLIO
import qualified Data.Text.Encoding as TE
import qualified Data.Text.Lazy.Encoding as TLE
-- CONTROL FLOW
{-# LANGUAGE ViewPatterns #-}
headNil :: [a] -> [a]
headNil (headMay -> Just x) = [x]
headNil _ = []
{-# LANGUAGE TupleSections #-}
first :: a -> (a, Bool)
first = (,True)
{-# LANGUAGE MultiWayIf #-}
bmiTell :: Float -> String
bmiTell bmi = if
| bmi <= 18.5 -> "You're underweight."
| bmi <= 25.0 -> "You're average weight."
| otherwise -> "You're overewight."
{-# LANGUAGE LambdaCase #-}
\\case
p1 -> 32
p2 -> 32
-- RECORDS
{-# LANGUAGE RecordWildCards #-}
-- Extracting from a record using wildcards.
scope :: Example -> (Int, Text, Text)
scope Example {..} = (e1, e2, e3)
-- Assign to a record using wildcards.
assign :: Example
assign = Example {..}
where
(e1, e2, e3) = (1, "Kirk", "Picard")
{-# LANGUAGE DuplicateRecordFields #-}
-- Derives
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- Text fixes
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
import qualified Data.Text as T
default (T.Text)
{-# LANGUAGE OverloadedLists #-}
modusPonens :: (p -> q) -> p -> q
modusPonens = ($)
nonEmptySubstrings :: [a] -> [[a]]
nonEmptySubstrings = concatMap (tail . inits) . tails
count :: Ord a => [a] -> Map.Map a Int
count input = Map.fromListWith (+) [(c, 1) | c <- input]
r/haskell - Automatically filling in pure, , fmap from Monad instance