[Grace-core] typeof/decltype/getType as alternaties to generic methods?
Marco Servetto
marco.servetto at gmail.com
Wed Nov 19 21:47:13 PST 2014
I have some problem to understand this typeof issue.
to have a map method, why do not just do the following:
class Map[Src,Dest]:{
List[Dest] apply(List[Src] arg ) ((function Src->dest) f): {
List[Dest] result=List[Dest].empty()
arg.forall([x->result.add(f(x))]
return result
}
}
Usage
Map[int, string](myList) [ x-> format(i)]
On 19 November 2014 18:11, James Noble <kjx at ecs.vuw.ac.nz> wrote:
> Hi all
>
> continuing some thoughts on generic methods, particular Marco's question
> (do we need them?) and discussions with Tim about other ways to get some
> of the same effects.
>
> Kim mentioned the "map" method. In Java8, we have
>
> class Stream<T> {
> <R> Stream<R> map(Function<? super T,? extends R> mapper)
> //...
> }
>
> in square bracket Grace, without generic<> methods, we could write this something like:
>
> class Stream[T].new {
> method map(mapper : type { apply(T) -> Object) -> Stream[Object]
> }
>
> (alternatively we could replace Object with Unknown for more dynamicity)
>
> The problem is that we need to talk about the return type of the block,
> which would be captured automatically by the Java generic method type parameter <R>.
>
> I wonder if we can use some variant of a "typeof" (or "decltype") operator
> that returns the type of an expression. We'd have to write a mouthful like
>
> class Stream[T].new {
> method map(mapper : type { apply(T) -> Object) } )
> -> Stream[ typeof(mapper.apply(_)) ]
>
> with the intention that this means the return type of the method is
> a stream of elements of the type returned by that apply method.
>
> The catch seems to be to define the "right" semantics for typeof.
> There are two obvious semantics:
> - the declared type (C++'s decltype) that would return "Object"
> - the dynamic type (roughly C#s e.GetType) --- although that's closer to Smalltalks "class" really
> but of course it wouldn't make much sense to put this in a type declaration!
>
> I fear what we'd want is rather more subtle / twisted semantics for typeof
> - statically inside the method: the declared type
> - dynamically inside the method: the dynamic type?
> - statically outside, in the caller's context: the static type of the expression with types bound.
>
> So e.g. were I to write something like
>
> def inputStream : Stream[Number] = ...
> def outputStream = inputStream.map { each : Number -> each.asString }
>
> then outputStream will be statically declared as a Stream[String]
> (each has type Number, Number.asString -> String, so we infer the type of the block as
> type { apply( _ :Number) -> String) }
>
> we can pass this to map because type { apply( _ :Number) -> String) <: type { apply(Number) -> Object) } )
> but (in the requesting context) we statically compute the return type of map as Stream(Number)
> because "typeof(mapper.apply(_))" is String.
>
>
> I hope this doesn't have the full power of wildcards, but I don't know for sure, of course.
>
> I also hope this (along with Grace's type system without variance annotations) would be sound,
> but we don't quite know that either (and Jonathan Aldrich suggested in places it may not be)
>
> james
>
>
>
>
> footnote:
>
> in Grace with generic<> methods, the example is:
>
> class Stream.new<T> {
> method map<R>(mapper : type { apply(T) -> Object) -> Stream[R]
> }
>
> but if we write
>
> def inputStream : Stream<Number> = ...
> def outputStream = inputStream.map { each : Number -> each.asString }
>
> then outputStream will be a Stream<Unknown> because the <R> method argument defaults to Unknown.
> to get the desired result, we'd have to write
>
> def outputStream = inputStream.map<String> { each : Number -> each.asString }
>
> but even then, the result of the block inside map isn't statically checked to be String.
> _______________________________________________
> Grace-core mailing list
> Grace-core at cecs.pdx.edu
> https://mailhost.cecs.pdx.edu/mailman/listinfo/grace-core
More information about the Grace-core
mailing list