[commit: ghc] master: Trac #8581 users_guide/glasgow_exts section 10.7 (471a992)
git at git.haskell.org
git at git.haskell.org
Thu Jul 12 15:37:28 UTC 2018
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/471a992ab956fe90d51b875a81d6963592db5553/ghc
>---------------------------------------------------------------
commit 471a992ab956fe90d51b875a81d6963592db5553
Author: AntC <anthony_clayden at clear.net.nz>
Date: Wed Jun 20 23:17:31 2018 +1200
Trac #8581 users_guide/glasgow_exts section 10.7
as per comments on the ticket; also linked to Haskell folk art of 'Smart constructors'.
>---------------------------------------------------------------
471a992ab956fe90d51b875a81d6963592db5553
docs/users_guide/glasgow_exts.rst | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/docs/users_guide/glasgow_exts.rst b/docs/users_guide/glasgow_exts.rst
index 44db5ab..c3322b7 100644
--- a/docs/users_guide/glasgow_exts.rst
+++ b/docs/users_guide/glasgow_exts.rst
@@ -5435,6 +5435,37 @@ pattern synonym: ::
pattern StrictJust a <- Just !a where
StrictJust !a = Just a
+Constructing an explicitly bidirectional pattern synonym also:
+
+- can create different data constructors from the underlying data type,
+ not just the one appearing in the pattern match;
+
+- can call any functions or conditional logic, especially validation,
+ of course providing it constructs a result of the right type;
+
+- can use guards on the lhs of the ``=``;
+
+- can have multiple equations.
+
+For example: ::
+
+ data PosNeg = Pos Int | Neg Int
+ pattern Smarter{ nonneg } <- Pos nonneg where
+ Smarter x = if x >= 0 then (Pos x) else (Neg x)
+
+Or using guards: ::
+
+ pattern Smarter{ nonneg } <- Pos nonneg where
+ Smarter x | x >= 0 = (Pos x)
+ | otherwise = (Neg x)
+
+There is an extensive Haskell folk art of `smart constructors
+<https://wiki.haskell.org/Smart_constructor>`_,
+essentially functions that wrap validation around a constructor,
+and avoid exposing its representation.
+The downside is that the underlying constructor can't be used as a matcher.
+Pattern synonyms can be used as genuinely smart constructors, for both validation and matching.
+
The table below summarises where each kind of pattern synonym can be used.
+---------------+----------------+---------------+---------------------------+
@@ -5508,7 +5539,7 @@ the syntax for bidirectional pattern synonyms is: ::
and the syntax for explicitly bidirectional pattern synonyms is: ::
pattern pat_lhs <- pat where
- pat_lhs = expr
+ pat_lhs = expr -- lhs restricted, see below
We can define either prefix, infix or record pattern synonyms by modifying
the form of `pat_lhs`. The syntax for these is as follows:
@@ -5522,6 +5553,9 @@ Infix ``arg1 `Name` arg2``
Record ``Name{arg1,arg2,...,argn}``
======= ============================
+The `pat_lhs` for explicitly bidirectional construction cannot use Record syntax.
+(Because the rhs *expr* might be constructing different data constructors.)
+It can use guards with multiple equations.
Pattern synonym declarations can only occur in the top level of a
module. In particular, they are not allowed as local definitions.
More information about the ghc-commits
mailing list