Hugs-Users
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1999 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1998 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1997 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1996 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1995 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1994 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1993 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1992 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1991 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1990 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1989 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1988 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1987 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1986 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1985 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1984 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1983 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1982 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1981 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1980 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1979 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1978 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1977 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1976 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1975 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1974 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1973 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1972 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1971 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1970 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
November 2018
- 1 participants
- 2 discussions
Gaster & Jones 1996 says
"We consider two rows to be equivalent if they include the same fields
regardless of the order in which they are listed." [section 3.2]
But this is tricky: Figure 6 shows there is an ordering on labels, so that
in effect records are compiled to tuples with left-to-right ordering of
label names alphabetically.
The User Manual says
"The order of fields in a record pattern *is* significant because it
determines the order---from left to right---in which they are matched."
In particular, a pattern match on a record with a field value `undefined`
might succeed if some other field label is mentioned first in the pattern;
but throw an error if it's the undefined field's label mentioned first.
It's not difficult to expose this behaviour. Consider
> import Hugs.Trex
>
> x5y = (x = 5, y = 'y'); x7y = (x = 7, y = undefined)
> z5y = (z = 5, y = 'y'); z7y = (z = 7, y = undefined)
>
> x5y == x7y -- returns False
> z5y == z7y -- throws error Prelude.undefined
The tuples with label `z` are compiled to put that field second, regardless
of the order of appearing in the expression. Then (==) applies by comparing
field values in left-to-right alphabetic ordering. Field `x` is
alphabetically before `y`; and the `x` values differ; so the comparison
returns False without comparing the `y` values. Then in comparing the field
`z` records, the `y` fields are compared first (ignoring that the `z`
values differ), exposing that one `y` field is `undefined`.
This is similar to comparing tuples
> (5, 'y') == (7, undefined) -- returns False
> ('y', 5) == (undefined, 7) -- throws error
There seems to be some infelicity when building records:
> f ... rho ... = (y = 'y' | rho)
This throws strange errors depending whether `rho` includes labels that are
alphabetically before `y`. Bug report incoming ...
AntC
1
0
musing on this
https://mail.haskell.org/pipermail/beginners/2018-October/018363.html
to which my reply talked mainly about Trex.
Does it make sense to regard a Trex record (or any free-standing
anonymous/extensible record) as a container, with values 'lifted' into the
structure, and an interface given by the label names, _not_ by order of
fields? That is, "container" in the Monad sense?
Does it further make sense if all the values are already lifted into some
Functor (like Maybe or (Either e) ) to hoist the Functor out over the
record structure?
I'm not sure I'm up with the program for Functor/Applicative/Monad
everywhere. If a record structure is a Functor, what's the type
constructor? `Rec`? If record structure is an Applicative, what's the
constructor for `pure` that lifts into `Rec`? The `<*>` aka `ap` or bind
for a Monad presumably is to take two records (with disjoint labels) and
concatenate them to a single record.
Given
data Person = Person (Rec( name :: String, age :: Int))
we want, corresponding to the question:
Person <?$> (age = 27) <*> (name = "Joe")
in which operator <?$> is map-like: it takes a function to its left that
expects a record of n fields, then maps over n singleton records with
corresponding labels appearing in any order.
I might be able to get there by generics/reflection over the field names
embedded in data constructor `Person`s type, then overloading <?$> to look
for each label. That is, if Hugs had any sort of generics/TypeRep.
Label names in Trex are literals; there's no such thing as a label
variable. (Which is why it's a tad annoying that they start lower case.)
Furthermore the same label name must appear in both terms and types -- in
fact labels occupy a namespace separate vs terms or types. So Trex is a
long way from from generic record handling like:
recAppend :: ( rho'\__x ) => Rec rho' -> Rec ( __x :: a) -> Rec ( __x :: a
| rho')
recAppend rho ( __x = x ) = ( __x = x | rho )
in which I've used double-underscore prefix to signify a label variable.
This is intended to extend a record `rho` with a singleton record. If we
try appending a record with more than one field, beware that field order is
arbitrary, so this
recAppend rho ( __x = x, __y = y) = ...
has no principal type (a familiar difficulty). The programmer doesn't care
which way round labels `__x, __y` bind, providing they're distinct, but the
typing does care.
Some sort of generic record extend/concatenate would be great. You might,
looking at Trex syntax, think that `|` is it. This is valid:
( x = "x" | (y = 'y' | (z = 3.14)))
( x = "x", y = 'y', z = 3.14 ) -- equivalent
I could put any record value in place of `(z = 3.14)`. But not in place of
the `x = ..` or `y = ...`: `|` is not an operator, not commutative, not
associative. Furthermore this is a place where parentheses make a
difference, unlike usually in Haskell. So the following are not equivalent,
indeed they're all invalid syntax
( (x = "x") | (y = 'y' | (z = 3.14))) -- x = ... has parens
( x = "x" | (y = 'y' | z = 3.14 )) -- z = ... doesn't have parens
( x = "x" | y = 'y' | (z = 3.14) ) -- z = ... in parens OK, but y
= ... is not
( (x = "x") | (y = 'y') | (z = 3.14) ) -- no chance
I'd like to write term `( rho1 | rho2 )` to concatenate two records. That's
currently unrecognised syntax, so I think could be added as such. What
would be its type/is it principal?
( rho1 | rho2 ) :: (rho1' \\ rho2') => Rec( rho1' | rho2' ) -- inventing
more syntax
in which constraint `(rho1' \\ rho2')` requires the two rows' labels be
mutually disjoint -- read "lacks all". Ur/web has something like this. Note
I'm not envisaging `|` as a genuine operator: this is still hard-wired
syntax; pipe is a reserved symbol in H98 anyway.
AntC
1
1