[Haskell-cafe] Re: Re[2]: [Haskell] Proposal: unification of
styleof function/data/type/class definitions
Brian Hulley
brianh at metamilk.com
Mon Sep 11 12:14:54 EDT 2006
Taral wrote:
> On 9/11/06, Bulat Ziganshin <bulat.ziganshin at gmail.com> wrote:
>> Expr Bool = Eq (Expr t) (Expr t) | forall t . Eq t
>
> Still confusing, but less so.
>
> The problem is that it's really backwards. The symbol being defined
> is "Eq".
> Eq (Expr t) (Expr t) | Eq t = Expr Bool
>
> but that doesn't fit well, does it? In my mind, the current mode is a
> functional one:
>
> Eq :: Eq t => Expr t -> Expr t -> Expr Bool
>
> And this is perfectly readable. The arrow means that the argument is
> an implicit propositional one, but it's still an argument.
Perhaps the proposed new style of function signature could also be used in a
GADT eg:
-- There is no need for the keyword "Data" because we know it's part of
-- a GADT because the function name is a conid - all such decls in a
module would
-- then be gathered together to form the GADT(s)
If :: Expr Bool -> Expr t -> Expr t -> Expr t
Eq :: Expr t -> Expr t -> Expr Bool | Eq t
Lit :: Int -> Expr Int
or
data
Expr t = If (Expr Bool) (Expr t) (Expr t)
Expr Bool = Eq (Expr t) (Expr t) | Eq t
Expr Int = Lit Int
The second option is of course backwards compared to a function declaration,
but this is natural because there can only ever be one clause for each value
constructor but mutiple clauses per result type, whereas in a function decl
there can be multiple clauses for each pattern but only one result type,
therefore function decls are inherently backwards wrt data decls...
Regards, Brian.
--
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.
http://www.metamilk.com
More information about the Haskell-Cafe
mailing list