Thank you very much! 

This solves the problem with the lambda expressions. However, I can't seem 
to work out other examples, so I'm guessing the type-infer function still 
has some problems or I'm still missing something. I've added some more test 
cases in the Gist.



On Sunday, March 15, 2020 at 2:32:42 PM UTC, Sorawee Porncharoenwase wrote:
>
> You need to add a case in parse-expr to deal with annotations, which is 
> in the form (<expr> : <type>).
>
> E.g.,
>
> [`(,e : ,t) (TA (parse-expr e) (parse-type t))]
>
>
> On Sun, Mar 15, 2020 at 7:21 AM Adrian Manea <[email protected] 
> <javascript:>> wrote:
>
>> Hi Matt,
>>
>> Thank you very much for the details! What you're saying makes sense and 
>> is in accordance with my intuition. But the code doesn't work as it is.
>>
>> I created a Gist for it here:
>>
>> https://gist.github.com/adimanea/7aa7921c913e70fb9a8b1524b5bd2d3c
>>
>> Everything is from the article, except for the (struct TA (type var)) 
>> which I created instead of the Ann ("type annotation") and the examples I 
>> used for tests.
>>
>> Regards,
>> Adrian
>>
>> On Sunday, March 15, 2020 at 2:10:55 PM UTC, Matt Jadud wrote:
>>>
>>> Hi Adrian,
>>>
>>> The article seems to be missing a type definition for Ann.
>>>
>>> Perhaps some of this you already know...
>>>
>>> (match expr ...)
>>>
>>> is a pattern matcher, working to find a pattern that 'expr' fits. 
>>>
>>> [(Lam _ _) ...]
>>>
>>> is attempting to match a pattern where a 'expr' is a struct called Lam, 
>>> and that structure has two fields. In this case, the value of those fields 
>>> is ignored, so the variable '_' is used to (by convention, not by syntax) 
>>> tell the programmer that these values do not matter. (At least, I'm 
>>> reasonably confident this is by convention and not by syntax.)
>>>
>>> The form
>>>
>>> [(Ann e t) ...] is matching the structure 'Ann', and binding the value 
>>> in the first field to the identifier 'e', and the second value to 't'. 
>>> Then, the expression following is executed (assuming the pattern matched).
>>>
>>> In the article, there is no struct definition for 'Ann'. I suspect it is 
>>> a typo/oversight. This would work:
>>>
>>> (struct Ann (e t))
>>>
>>> would be a reasonable definition. It says "Ann" is a data structure with 
>>> two fields, called "e" and "t".
>>>
>>> I haven't read the article, so "better" names for those fields is not 
>>> something I am going to come up with right now. The name in the definition 
>>> matters (to you, the programmer), but the identifier used to bind in the 
>>> pattern is not critical. (Or, it is again something that should be 
>>> important to you, but it does not need to match the names of the fields in 
>>> the struct definition.) 
>>>
>>> Hopefully that helps, and helps you move forward a bit. Ask more 
>>> questions if that didn't help. And, perhaps putting your code as-is in a 
>>> Github Gist or similar, so that others can look at exactly what you're 
>>> working with would be useful.
>>>
>>> (I have no idea how complete or incomplete the code in the article is, 
>>> which is why I suggest you put it in a pastebin/gist to share... there 
>>> might be other things that were glossed in the article? I don't know.)
>>>
>>> Cheers,
>>> Matt
>>>
>>>
>>> On Sun, Mar 15, 2020 at 10:01 AM Adrian Manea <[email protected]> 
>>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> I'm a mathematician delving into type theory and proof assistants and 
>>>> with special interests in Racket.
>>>>
>>>> I'm now trying to understand and implement P. Ragde's Proust 
>>>> <https://arxiv.org/abs/1611.09473> "nano proof assistant" and work 
>>>> through the examples in his article. However, I'm pretty much a beginner 
>>>> in 
>>>> Racket and I'm getting some errors. Particularly in the type-infer 
>>>> function, that's also used in the type-check function.
>>>>
>>>> Here is the code in the article:
>>>>
>>>> (define (type-check ctx expr type)
>>>>   (match expr
>>>>     [(Lam x t)                           ; lambda expression
>>>>         (match type
>>>>            [(Arrow tt tw) (type-check (cons `(,x ,tt) ctx) t tw)]     ; 
>>>> arrow type
>>>>            [else (cannot-check ctx expr type)])]
>>>>     [else (if (equal? (type-infer ctx expr) type) true (cannot-check 
>>>> ctx expr type))]))
>>>>
>>>> (define (type-infer ctx expr)
>>>>   (match expr
>>>>     [(Lam _ _) (cannot-infer ctx expr)]
>>>>     [(Ann e t)  (type-check ctx e t) t]
>>>>     [(App f a)                            ; function application
>>>>       (define tf (type-infer ctx f))
>>>>          (match tf
>>>>             [(Arrow tt tw) #:when (type-check ctx a tt) tw]
>>>>             [else (cannot-infer ctx expr)])]
>>>>     [(? symbol? x)
>>>>          (cond
>>>>              [(assoc x ctx) => second]
>>>>              [else (cannot-infer ctx expr)])]))
>>>>
>>>> The first question I have is: what's the (Ann e t) supposed to mean, 
>>>> because I'm getting a syntax error? Is it a type annotation? If so, 
>>>> shouldn't everything be inside the #lang typed/racket module and type 
>>>> annotations everywhere?
>>>>
>>>> Secondly, the functions don't seem to work like this, as I'm getting 
>>>> failed matches for everything that's not a lambda expression. Can you 
>>>> please help me clarify the code there or maybe it's already available 
>>>> somewhere? Because just typing in the examples in the article simply 
>>>> doesn't work. I can understand what they are supposed to do, but I 
>>>> lack the skills to fix things myself.
>>>>
>>>> Thank you!
>>>>
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Racket Users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/racket-users/6bdfed6a-13c7-4e86-8dcf-5d61b18e15d7%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/racket-users/6bdfed6a-13c7-4e86-8dcf-5d61b18e15d7%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/racket-users/1cde88c7-0eb8-4cf6-9a80-3708b7e35a6b%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/racket-users/1cde88c7-0eb8-4cf6-9a80-3708b7e35a6b%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/d883c74b-a43b-438d-97ee-e57464646a79%40googlegroups.com.

Reply via email to