| ... | ... | @@ -23,62 +23,111 @@ This would make the update syntax actually useful |
|
|
|
|
|
|
|
- label-based pattern matching
|
|
|
|
|
|
|
|
|
|
|
|
the function:
|
|
|
|
|
|
|
|
|
|
|
|
```wiki
|
|
|
|
f val { x = "foo" } = 4
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
should match if passed a Foo or a Bar with x being equal to "foo" and val would be bound to its argument (like an @ pattern)
|
|
|
|
>
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > the function:
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > ```wiki
|
|
|
|
> > f val { x = "foo" } = 4
|
|
|
|
> > ```
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > should match if passed a Foo or a Bar with x being equal to "foo" and val would be bound to its argument (like an @
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
pattern)
|
|
|
|
|
|
|
|
|
|
|
|
```wiki
|
|
|
|
g _ { y = 3 } = 4
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
would match only the Bar constructor since it is the only one with a y field.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This would mitigate the problems caused by accessors being partial functions since you can use a simple case statement to get the effect of an accesor that returns its result in a Maybe.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note from Simon. I hate that the above defn of 'f' has just one argument (val {x="foo")),
|
|
|
|
whereas it looks as if it has two. (This is a problem with existing Haskell.) It looks
|
|
|
|
like 'f' has an argument 'val' and another arguement that is a free-standing record,
|
|
|
|
something we really want in the end anyhow. Not sure how to fix this. val@{x="foo")?
|
|
|
|
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> would match only the Bar constructor since it is the only one with a y field.
|
|
|
|
>
|
|
|
|
>
|
|
|
|
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> This would mitigate the problems caused by accessors being partial functions since you can use a simple case statement to get the effect of an accesor that returns its result in a Maybe.
|
|
|
|
>
|
|
|
|
>
|
|
|
|
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> Note from Simon. I hate that the above defn of 'f' has just one argument (val {x="foo")),
|
|
|
|
> whereas it looks as if it has two. (This is a problem with existing Haskell.) It looks
|
|
|
|
> like 'f' has an argument 'val' and another arguement that is a free-standing record,
|
|
|
|
> something we really want in the end anyhow. Not sure how to fix this. val@{x="foo")?
|
|
|
|
>
|
|
|
|
>
|
|
|
|
|
|
|
|
- first class update and setting syntax (more advanced, needs better syntax)
|
|
|
|
|
|
|
|
|
|
|
|
A syntax for updating and setting fields should be allowed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
some possibilites are
|
|
|
|
|
|
|
|
>
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > A syntax for updating and setting fields should be allowed.
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
>
|
|
|
|
|
|
|
|
>
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > some possibilites are
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
>
|
|
|
|
|
|
|
|
```wiki
|
|
|
|
|
|
|
|
foo { x = }
|
|
|
|
|
|
|
|
would be equivalant to (\v -> foo { x = v })
|
|
|
|
would be equivalent to (\v -> foo { x = v })
|
|
|
|
|
|
|
|
foo { x \ }
|
|
|
|
|
|
|
|
would be equivalant to
|
|
|
|
would be equivalent to
|
|
|
|
|
|
|
|
(\f -> foo { x = case foo of _ {x} -> foo { x = f x }; _ -> foo })
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
- polymorphic record update
|
|
|
|
|
|
|
|
>
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > Given a record like:
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > ```wiki
|
|
|
|
> > data Foo a = Foo { bar :: a }
|
|
|
|
> > ```
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > it would be nice to be able to update it like:
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > ```wiki
|
|
|
|
> > f = Foo { bar = 'a' }
|
|
|
|
> > g = f { bar = False }
|
|
|
|
> > ```
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
> > Note the change in the type of the stored field. At the moment, such a record update must be written using the
|
|
|
|
> > data constructor, not the update syntax.
|
|
|
|
> >
|
|
|
|
> >
|
|
|
|
>
|
|
|
|
|
|
|
|
## open statement
|
|
|
|
|
|
|
|
|
| ... | ... | @@ -108,3 +157,7 @@ f x = ... where |
|
|
|
open x would be allowed at the top level, in a let binding, or in a where binding.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|