[Ur] Unsupported expression

Adam Chlipala adamc at csail.mit.edu
Wed Jan 4 07:39:06 EST 2017


On 01/04/2017 05:40 AM, Marco Maggesi wrote:
> I'm trying to figure out what is wrong with this program:
>
> fun mapseq [m ::: Type -> Type] (_ : monad m) [t ::: Type]
>             (f : t -> m unit) (ls : list t)
>    : m unit
>    = case ls of
>       [] => return ()
>     | h :: t => f h; mapseq f t
>
> val l = "a" :: "b" :: "c" :: []
>
> fun main () =
>    mapseq (fn s => debug s) l;
>    return <xml/>

Shallow answer: that function is already in the standard library as 
[List.app], and it will work in your example if used instead of [mapseq].

Deeper answer: you've run into the general heuristic nature of the 
compiler optimizations to remove all uses of polymorphism, where the 
compiler will give up if any polymorphism remains in the end, in 
server-side code.  These optimizations generally work best when all of a 
function's type parameters appear before any value parameters. So, 
swapping [t] and the [monad] argument does the trick (without requiring 
any changes to the actual calls).



More information about the Ur mailing list