Bump version
[packages/hoopl.git] / PROBLEMS
1 Problems with polymorphic transfer functions on the left of an arrow
2 using RankNTypes: 
3
4   - Can't easily write generic debugging code to show facts
5     propagating through a graph, because
6       . can't tell the shape of the node
7       . therefore can't tell the type of the facts
8
9   - Can't write a generic dominator analysis that assumes only (Edges n)
10
11   - Can't use default cases (or at least not easily) in the transfer
12     function
13
14   - Harder to reuse common predicate transformers like
15
16       - id
17       - distributeFacts :: Edges n => n -> f -> FactBase f
18         distributeFacts n f = mkFactBase [(l, f) | l <- successors n]
19
20
21
22 ----------------------------------
23 Instructions given to NR's class:
24
25
26 All,
27
28 If you consult the type definition of FwdTransfer,
29 you'll see that it requires a polymorphic function and uses a type 
30 family which alters the types of arguments and results depending on
31 the shape of a node.  If the type of a fact is 'f', then
32
33   - The predicate transformer for a closed/open node has type  f -> FactBase f
34   - The predicate transformer for an open/open node has type   f -> f
35   - The predicate transformer for an open/closed node has type FactBase f -> f
36
37 Simon was very enamored of this interface, but it's clear that it
38 imposes a heavy burden on clients:
39
40  1. For a typical first node such as
41
42         LabelNode l
43
44     You'll have to capture the fact using
45
46         fromJust $ factLookup factbase l
47
48  2. For a last node you may want something like
49
50         \f -> mkFactBase [(l, f) | l <- successors n]
51
52     Some last nodes may require more elaborate code.
53
54  3. Because the function is both GADT and polymorphic, you can't
55     default any cases---every constructor has to be written
56     explicitly.  When you are doing this, but you don't care about the
57     constructor's arguments, it can be useful to use the record
58     wildcard syntax:
59
60        xfer (ArraySet {}) = id
61
62     This syntax matches any fully saturated application of ArraySet,
63     no matter how many arguments ArraySet expects.
64
65     
66
67
68 Norman