Changes between Version 10 and Version 11 of Rank2Types
 Timestamp:
 Feb 17, 2007 12:28:58 AM (8 years ago)
Legend:
 Unmodified
 Added
 Removed
 Modified

Rank2Types
v10 v11 6 6 Functions may have polymorphic arguments, subject to three restrictions: 7 7 8 *Such functions must have explicit type signatures, using `forall` to bind polymorphic type variables, e.g.9 {{{8 1. Such functions must have explicit type signatures, using `forall` to bind polymorphic type variables, e.g. 9 {{{ 10 10 g :: (forall a. a > a) > (Bool, Char) 11 11 }}} 12 13 * In the definition of the function, polymorphic arguments must be matched on the lefthand side, and can only be matched by a variable or wildcard (`_`) pattern. The variable then has the polymorphic type of the corresponding argument, e.g. 14 {{{ 12 2. In the definition of the function, polymorphic arguments must be matched on the lefthand side, and can only be matched by a variable or wildcard (`_`) pattern. The variable then has the polymorphic type of the corresponding argument, e.g. 13 {{{ 15 14 g f = (f True, f 'a') 16 15 }}} 17 18 * When such a function is used, it must be applied to at least as many arguments to include the polymorphic ones (so it's a good idea to put those first). Each expression must have a generalized type at least as general as that declared for the corresponding argument, e.g. 19 {{{ 16 3. When such a function is used, it must be applied to at least as many arguments to include the polymorphic ones (so it's a good idea to put those first). Each expression must have a generalized type at least as general as that declared for the corresponding argument, e.g. 17 {{{ 20 18 g id 21 19 g undefined 22 20 }}} 23 The more general [wiki:RankNTypes] remove the last two restrictions. 24 25 '''Questions from Iavor:''' 26 * The restriction that polymorphic arguments have to be matched by variable or wildcard (`_`) patterns does not appear to be specific to rank2 typesit seems like an orthogonal decision. 27 * While the rankN proposal removes restriction (3), in many cases the results may be unexpected. For example, consider the classic example of using {{{runST}}}: 28 {{{ 29 x = runST (return a)  OK 30 y = runST $ return 'a' 31 }}} 32 The rank2 design rejects {{{y}}} because {{{runST}}} needs an extra argument. The rankN design accepts this use but later fails because the inferred type for '{{{runST}}}' is 'less polymorphic than expected'. 33 34 35 36 37 38 21 The more general [wiki:RankNTypes] remove the last restriction in many cases. 39 22 40 23 == References ==