# [plt-scheme] Predicates from Types

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?
>* --
*>* sam th
*>* samth at ccs.neu.edu
*>*
*
--
Paulo Jorge Matos - pocmatos at gmail.com
Webpage: http://www.personal.soton.ac.uk/pocm