# [Haskell-cafe] tuple and pattern synonym

David Feuer david.feuer at gmail.com
Mon May 18 04:18:20 UTC 2020

```By the way, I personally don't consider the syntax you need to use here
remotely obvious. I really wish we had something more intuitive for
defining these sorts of patterns!

On Mon, May 18, 2020, 12:14 AM David Feuer <david.feuer at gmail.com> wrote:

> You need to use a view pattern with an explicitly bidirectional pattern
> synonym:
>
> pattern P :: (Int,Int) -> Foo
> pattern P xy <- ((\(Foo x y) -> (x, y)) -> xy)
>   where
>     P (x, y) = Foo x y
>
> If the Foo type had more than one constructor, then you'd need to do
> something a bit trickier, like
>
> pattern P xy <- ((\case
>                                Foo x y -> Just (x, y)
>                                _ -> Nothing) -> Just xy)
>   where
>     P (x, y) = Foo x y
>
> On Sun, May 17, 2020, 11:57 PM Kazu Yamamoto <kazu at iij.ad.jp> wrote:
>
>> Hi,
>>
>> I have a question about PatternSynonyms. Suppose we have:
>>
>>    data Foo = Foo Int Int
>>
>> I would like to define a pattern as follows:
>>
>>    pattern P :: (Int,Int) -> Foo
>>    pattern P (x,y)  = Foo x y
>>
>> But this results in "parse error on input ‘(’". Are there any ways to
>> use tuple in the left side hand of patterns?
>>
>> This is important to maintain backward compatibility for the "network"
>> library.
>>
>> If there is no way, I will define Foo as:
>>
>>    data Foo = Foo (Int,Int) -- awkward
>>
>> and define P as:
>>
>>    pattern P :: (Int,Int) -> Foo
>>    pattern P xy = Foo xy
>>
>> Regards,
>>
>> --Kazu
>> _______________________________________________
>> To (un)subscribe, modify options or view archives go to:
>> Only members subscribed via the mailman list are allowed to post. lol
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
```