Changes between Version 61 and Version 62 of DataParallel/ClosureConversion/ClassLess


Ignore:
Timestamp:
May 3, 2007 10:37:42 AM (8 years ago)
Author:
chak
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DataParallel/ClosureConversion/ClassLess

    v61 v62  
    133133                    iso<t1> iso<t2>
    134134iso<t1 t2>      = iso<t1> iso<t2>
    135 iso<forall a.t> = iso<t>
     135iso<forall a.t> = toIso :<->: frIso
     136  where
     137    toIso (x::forall a.t) = /\a. to (iso<t>)@a x@a
     138    frIso (x::forall a.t) = /\a. fr (iso<t>)@a x@a
    136139}}}
    137140where
    138141{{{
    139142idIso<*>      = id :<->: id
     143}}}
     144
     145'''OPEN PROBLEM:''' What should `idIso<k>` do for `k` other than `*`?  We might think
     146{{{
    140147idIso<k1->k2> = \_ -> (idIso<k2>)
    141148}}}
    142 
    143 '''TODO:''' This doesn't work for types with constructor variables yet, as the `f (Int -> Int)` example below.  Roman has an example, where we actually do need a conversion of the `Int -> Int` to a closure.
     149would work, but it doesn't always.  Take this example
     150{{{
     151data T a = MkT a
     152unit :: T a -> a
     153unit (MkT x) = x
     154
     155-- converted
     156foo :: f (Int -> Int) -> (forall a. f a -> a) -> Int
     157foo t u = u t 1
     158
     159-- not converted
     160bar = foo unit
     161}}}
     162Here, we will have to convert the first argument to `foo` and that conversion needs to convert the embedded `Int -> Int` to `Int :-> Int`, which is hard to do in `foo = fr iso<...> foo_CC` as we don't know anything about `f::*->*`.
    144163
    145164==== Examples ====
     
    151170iso<[a -> a]>       = isoList (isoArr (id :<->: id)
    152171                                      (id :<->: id))
    153 iso<f (Int -> Int)> = (\_ -> (id :<->: id))
    154                         (isoArr isoInt isoInt)
    155                     = id :<-> id
     172iso<f (Int -> Int)> = ???
    156173}}}
    157174