Re: [m-users.] Higher order type with existential quanitfication

Volker Wysk <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>
Am Montag, dem 23.10.2023 um 19:56 +1100 schrieb Zoltan Somogyi:
> On 2023-10-23 19:32 +11:00 AEDT, "Volker Wysk" <[email protected]> wrote:
> > Am Montag, dem 23.10.2023 um 19:17 +1100 schrieb Zoltan Somogyi:
> > > On 2023-10-22 22:54 +11:00 AEDT, "Volker Wysk" <[email protected]> wrote:
> > > > I have a predicate which takes an existentially quantified type as one of
> > > > its arguments.
> > > 
> > > By this, I presume you mean a predicate that *returns*
> > > a value of an existentially quantified type.
> > 
> > No, it should take an existentially quantified value as its input argument
> 
> This does not make sense. This is from section 12.1.2 of the language reference manual
> (latest rotd version), titled "Semantics of type quantifiers:
> 
>   If a type variable in the type declaration for a polymorphic predicate or function is universally quantified,
>   this means the caller will determine the value of the type variable, and the callee must be defined
>   so that it will work for all types which are an instance of its declared type.
> 
>  For an existentially quantified type variable, the situation is the converse: the callee must determine
>   the value of the type variable, and all callers must be defined so as to work for all types
>   which are an instance of the called procedure’s declared type.
> 
> This means that for an existentially typed input argument, if one existed,
> 
> - the caller would determine its value before the call, and
> - the callee would determine its type during the call.
> 
> Since in Mercury, you cannot choose a value without choosing a type,
> this cannot happen.
> 
> I suspect we are talking past each other because you use "existentially quantified type"
> to mean something other than its standard definition. Neither I nor anyone else can help you
> until you help us to understand what your question means. (For example, quantification
> applies to type *variables*, but the type of Pred is not a type variable. It *contains*
> type variables, but that is a different issue.)
> 
> I would also draw your attention to the start of section 12, which says:
>   
>   Mercury supports existential type quantifiers on predicate and function declarations, and in data type definitions
> 
> Note that it says you can put existential type quantifiers on pred and func declarations,
> but does not say that you can put them on the argument types inside them,
> and in fact, as you discovered, you can't. It is not a matter of syntax; it is a matter of
> what constructs the language does and does not support.

Does that mean, that it's impossible to define a map_hetlist predicate like
this:

:- type hetlist
    ---> some [T] hetcons(T, hetlist)   => att(T)
    ;    hetnil.

% declaration of map_hetlist?

map_hetlist(_, hetnil, []).

map_hetlist(Pred, hetcons(X, L), [Y|Ys]) :-
    Pred(X, Y),
    map_hetlist(Pred, L, Ys).


I half understand you. But let me try hard to understand by myself, before
you write another long answer.


Thnx,
Volker
_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.