
#12001: RFC: Add pattern synonyms to base -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: libraries/base | Version: 7.10.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Iceland_jack): === GHC.Generics === {{{#!hs pattern From :: Generic a => (Rep a) x -> a pattern From rep <- (from → rep) where From rep = to rep pattern From1 :: Generic1 f => (Rep1 f) a -> f a pattern From1 rep <- (from1 → rep) where From1 rep = to1 rep }}} or corresponding `To`, `To1` patterns. === Text.Read === {{{#!hs pattern Read :: Read a => a -> String pattern Read a <- (readMaybe -> Just a) }}} with the caveat that they parse different types, {{{#!hs foo :: String -> String foo (Read 42) = "answer" foo (Read n) = "some other number " ++ show n foo _ = "can't parse" }}} {{{ ghci> foo "()" "some other number ()" }}} If the types are made explicit with #11350 {{{#!hs foo :: String -> String foo (Read @Integer 42) = "answer" foo (Read @() n) = "some other number " ++ show n foo _ = "can't parse" }}} it is a common action and pattern (search for `pattern` and `readMaybe -> Just`), and is often use to pattern match on numbers. Artificially restricting the type avoids it matching `()` {{{#!hs pattern ReadNumber :: (Num a, Read a) => a -> String }}} This is cool {{{ ghci> [ n | ReadNumber n <- words "from 2010 ... 2016 they were 4" ] [2010,2016,4] }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12001#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler