[plt-scheme] Predicates from Types
On Thu, Apr 2, 2009 at 8:55 AM, Paulo J. Matos <pocmatos at gmail.com> wrote:
> On Thu, Apr 2, 2009 at 12:52 PM, Sam TH <samth at ccs.neu.edu> wrote:
>> On Thu, Apr 2, 2009 at 8:35 AM, Paulo J. Matos <pocmatos at gmail.com> wrote:
>>> On Wed, Apr 1, 2009 at 11:43 PM, Sam TH <samth at ccs.neu.edu> wrote:
>>>> On Wed, Apr 1, 2009 at 7:01 PM, Paulo J. Matos <pocmatos at gmail.com> wrote:
>>>>> Is there then a way to extract a predicate from a type? Given I assume
>>>>> the answer is no, what's the best solution for this?
>>>>> Right now I had to define :
>>>>> (: Predicate? (Any -> Boolean))
>>>>> (define (Predicate? u)
>>>>> (or (Quantifier? u) (Logic-Predicate? u) ...))
>>>>
>>>> This is the right solution, but you probably want the type:
>>>>
>>>> (: Predicate? (Any -> Boolean : Predicate))
>>>>
>>>
>>> Now you lost me here... Why do I need the ": Predicate" part? and what
>>> does it do?
>>
>> If a function has the type (Any -> Boolean : T), then that function is
>> a "predicate" for T (no relation to the "Predicate" in your mail).
>> This means that using that function checks if a value of of that type.
>> `number?' is an excellent example here. For example:
>>
>> (if (number? x) (add1 x) 7)
>>
>> always has type `Number'.
>>
>> Similarly, if you give `Predicate?' the type I described, then you can
>> use `Predicate?' to check membership in the type `Predicate' in the
>> same way.
>
> I got it, so it basically gives more information for the type
> inference mechanism to infer types in certain situations but doesn't
> really change the function itself, right?
This isn't related to type inference, so that's not correct. But it
doesn't change the behavior of the function (no type annotation ever
changes the behavior of a Typed Scheme function).
--
sam th
samth at ccs.neu.edu