Re: [Haskell-cafe] computation over containers, greatly simplified notation.

2012-12-01 Thread Takayuki Muranushi
Thank you Jason, I have implemented those.
https://github.com/nushio3/practice/blob/master/free-objects/zipn-03.hs

I implemented what I have wanted. It is forZN in the following code.

https://github.com/nushio3/practice/blob/master/free-objects/zipf-05.hs

forZN, much like printf, can be used in place of any of the following
functions.

forLiftZ1 :: Zip f = f a - (a - b) - f bforLiftZ2 :: Zip f = f a
- f b - (a - b - c) - f c
forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f d

...and more...


The last example in above code is the usecase of forZN in my mind: to zip
several arrays with a long lambda. This pattern occurs frequently in my
codes.

One drawback of current approach is that we need verbose type annotations
like
 :: V.Vector String in   print $ (forZN vd1 vc1 vi1 f_dci_s :: V.Vector
String) .

Maybe this is because PType carries insufficient type-level information,
compared to Reduce and Insert. Now I'm now wondering if we can use
ghc-7.6.1's rich kind features such as type-level lists to remove those
verbose type annotations.




2012/12/1 Jason Dagit dag...@gmail.com

 You might find this paper an interesting read:
 http://www.brics.dk/RS/01/10/

 On Fri, Nov 30, 2012 at 4:43 PM, Takayuki Muranushi 
 muranu...@gmail.comwrote:

 Dear everyone,

 After a number of attempts [1] I'm starting to think that my initial
 approach was ill-directed.

 After all, Functor, Applicative, Zip are three different classes.
 Functors are type constructors where you can map unary functions over
 them.
 Applicatives are those with map-over of zero-ary functions (pure,) unary
 functions, binary functions, ternary functions, ... etc.
 Zip are those with unary, binary, ternary ... mapover, but not zero-ary
 map-over.

 Repa Arrays and Vectors belong to Zip because there's no trivial unique
 way to implement pure.

 What the customer really needed [2] seems to be the following series of
 functions:


 forLiftZ1 :: Zip f = f a - (a - b) - f b



 forLiftZ2 :: Zip f = f a - f b - (a - b - c) - f c




 forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f d



 Now I'm trying if it's possible to implement the series in a single shot
 [3] .

 I'm reporting my progress for anyone who might be still thinking for me.
 Thank you!!

 [1] https://github.com/nushio3/practice/tree/master/free-objects
 [2] http://www.projectcartoon.com/cartoon/3
 [3]
 https://github.com/nushio3/practice/blob/master/free-objects/printf6.hs




 2012/11/29 Takayuki Muranushi muranu...@gmail.com

 Dear all,

 I came up with an idea to greatly simplify some kinds of array
 computations. It should work well with many kinds of arrays. Is this new?

 https://gist.github.com/4162375



 These few days, I've been trying to rewrite a hydrodynamic simulation
 code that used Data.Vector (~250 lines), to Repa [1] . It seemed promising,
 but soon I realized that I needed to use Repa.map and Repa.zipWith almost
 everywhere. I need careful thinking to transform every lines (that used
 vector's indexing) to Repa's point-free stile. Is there any better ways?

 Then I realized that I was the author of Paraiso [2], a DSL for stencil
 computation. One of its feature is to write down array computation just as
 if it were scalar computation.

 Basically what I need is ZipList-like Applicative instances for vectors
 and Repa arrays. Why not they support ZipVector? Because 'pure' of zipList
 was an infinite list and you can't do infinite vectors. Then I came up with
 this idea.

 https://gist.github.com/4162375

 the wrapper W does several things: it represents the 'pure,' homogeneous
 array in a space-efficient manner, and also serves as a newtype-wrapper of
 Num (and possibly Fractional, Floating...) instances.

 Questions are: is this technology new? or promising? doomed?
 It seems to me like a free-Applicative, like the free-Monad theory. Are
 they related?
 The function 'backend' helps to mix in the non-zip-like computations.
 How can we remove the 'undefined' in the 'backend?'
 Some of Repa computations are Monads. W needs to be a monad transformer
 to incooperate this.

 Also I'm grateful to past cafe discussion on existing Zippable
 implementations [3][4] .

 [1] hackage.haskell.org/package/repa
 [2] http://hackage.haskell.org/package/Paraiso
 [3] http://www.haskell.org/pipermail/haskell-cafe/2009-July/064403.html
 [4]
 http://hackage.haskell.org/packages/archive/category-extras/latest/doc/html/Control-Functor-Zip.html


 --
 Takayuki MURANUSHI
 The Hakubi Center for Advanced Research, Kyoto University
 http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html




 --
 Takayuki MURANUSHI
 The Hakubi Center for Advanced Research, Kyoto University
 http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe





-- 
Takayuki MURANUSHI
The Hakubi Center for Advanced Research, Kyoto University

Re: [Haskell-cafe] computation over containers, greatly simplified notation.

2012-12-01 Thread Takayuki Muranushi
Dear all,

https://github.com/nushio3/practice/blob/master/free-objects/zipf-12.hs

I was finally able to remove the verbose type annotations.

The point was (1) to let the argument-list carry the type-constructor
information, so that only values of the type (v a) can enter the
heterogeneous list;

data Cons (v :: * - *) a b = Cons a b deriving (Eq, Show)
data Nil  (v :: * - *) = Nil  deriving (Eq, Show)

(2) to change the remainder of the program accordingly, and (3) to add
the following subtle modification, because instance finder does not
attempt to match unknown type a0 to v result, but it does so to
result.


class Reduce v f vxS result vyS | v f vxS - result vyS where
  reduce :: v f - vxS - (v result, vyS)
   ↓
class Reduce v f vxS result vyS | v f vxS - result vyS where
  reduce :: v f - vxS - (result, vyS)


Other samples work with modest type annotations.
https://github.com/nushio3/practice/blob/master/free-objects/zipf-13.hs


2012/12/1 Takayuki Muranushi muranu...@gmail.com

 Thank you Jason, I have implemented those. 
 https://github.com/nushio3/practice/blob/master/free-objects/zipn-03.hs

 I implemented what I have wanted. It is forZN in the following code.

 https://github.com/nushio3/practice/blob/master/free-objects/zipf-05.hs

 forZN, much like printf, can be used in place of any of the following 
 functions.

 forLiftZ1 :: Zip f = f a - (a - b) - f b
 forLiftZ2 :: Zip f = f a - f b - (a - b - c) - f c
 forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f
 d

 ...and more...


 The last example in above code is the usecase of forZN in my mind: to zip 
 several arrays with a long lambda. This pattern occurs frequently in my codes.

 One drawback of current approach is that we need verbose type annotations like
  :: V.Vector String in   print $ (forZN vd1 vc1 vi1 f_dci_s :: V.Vector 
 String) .

 Maybe this is because PType carries insufficient type-level information, 
 compared to Reduce and Insert. Now I'm now wondering if we can use 
 ghc-7.6.1's rich kind features such as type-level lists to remove those 
 verbose type annotations.





 2012/12/1 Jason Dagit dag...@gmail.com

 You might find this paper an interesting read: http://www.brics.dk/RS/01/10/

 On Fri, Nov 30, 2012 at 4:43 PM, Takayuki Muranushi muranu...@gmail.com 
 wrote:

 Dear everyone,

 After a number of attempts [1] I'm starting to think that my initial 
 approach was ill-directed.

 After all, Functor, Applicative, Zip are three different classes.
 Functors are type constructors where you can map unary functions over them.
 Applicatives are those with map-over of zero-ary functions (pure,) unary 
 functions, binary functions, ternary functions, ... etc.
 Zip are those with unary, binary, ternary ... mapover, but not zero-ary 
 map-over.

 Repa Arrays and Vectors belong to Zip because there's no trivial unique way 
 to implement pure.

 What the customer really needed [2] seems to be the following series of 
 functions:


 forLiftZ1 :: Zip f = f a - (a - b) - f b




 forLiftZ2 :: Zip f = f a - f b - (a - b - c) - f c





 forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f d





 Now I'm trying if it's possible to implement the series in a single shot 
 [3] .

 I'm reporting my progress for anyone who might be still thinking for me. 
 Thank you!!

 [1] https://github.com/nushio3/practice/tree/master/free-objects
 [2] http://www.projectcartoon.com/cartoon/3
 [3] https://github.com/nushio3/practice/blob/master/free-objects/printf6.hs




 2012/11/29 Takayuki Muranushi muranu...@gmail.com

 Dear all,

 I came up with an idea to greatly simplify some kinds of array 
 computations. It should work well with many kinds of arrays. Is this new?

 https://gist.github.com/4162375



 These few days, I've been trying to rewrite a hydrodynamic simulation code 
 that used Data.Vector (~250 lines), to Repa [1] . It seemed promising, but 
 soon I realized that I needed to use Repa.map and Repa.zipWith almost 
 everywhere. I need careful thinking to transform every lines (that used 
 vector's indexing) to Repa's point-free stile. Is there any better ways?

 Then I realized that I was the author of Paraiso [2], a DSL for stencil 
 computation. One of its feature is to write down array computation just as 
 if it were scalar computation.

 Basically what I need is ZipList-like Applicative instances for vectors 
 and Repa arrays. Why not they support ZipVector? Because 'pure' of zipList 
 was an infinite list and you can't do infinite vectors. Then I came up 
 with this idea.

 https://gist.github.com/4162375

 the wrapper W does several things: it represents the 'pure,' homogeneous 
 array in a space-efficient manner, and also serves as a newtype-wrapper of 
 Num (and possibly Fractional, Floating...) instances.

 Questions are: is this technology new? or promising? doomed?
 It seems to me like a free-Applicative, like the free-Monad theory. Are 
 they related?
 The function 'backend' helps to mix in the 

Re: [Haskell-cafe] computation over containers, greatly simplified notation.

2012-11-30 Thread Takayuki Muranushi
Dear everyone,

After a number of attempts [1] I'm starting to think that my initial
approach was ill-directed.

After all, Functor, Applicative, Zip are three different classes.
Functors are type constructors where you can map unary functions over them.
Applicatives are those with map-over of zero-ary functions (pure,) unary
functions, binary functions, ternary functions, ... etc.
Zip are those with unary, binary, ternary ... mapover, but not zero-ary
map-over.

Repa Arrays and Vectors belong to Zip because there's no trivial unique way
to implement pure.

What the customer really needed [2] seems to be the following series of
functions:

forLiftZ1 :: Zip f = f a - (a - b) - f b
forLiftZ2 :: Zip f = f a - f b - (a - b - c) - f c

forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f d

Now I'm trying if it's possible to implement the series in a single shot
[3] .

I'm reporting my progress for anyone who might be still thinking for me.
Thank you!!

[1] https://github.com/nushio3/practice/tree/master/free-objects
[2] http://www.projectcartoon.com/cartoon/3
[3] https://github.com/nushio3/practice/blob/master/free-objects/printf6.hs



2012/11/29 Takayuki Muranushi muranu...@gmail.com

 Dear all,

 I came up with an idea to greatly simplify some kinds of array
 computations. It should work well with many kinds of arrays. Is this new?

 https://gist.github.com/4162375



 These few days, I've been trying to rewrite a hydrodynamic simulation code
 that used Data.Vector (~250 lines), to Repa [1] . It seemed promising, but
 soon I realized that I needed to use Repa.map and Repa.zipWith almost
 everywhere. I need careful thinking to transform every lines (that used
 vector's indexing) to Repa's point-free stile. Is there any better ways?

 Then I realized that I was the author of Paraiso [2], a DSL for stencil
 computation. One of its feature is to write down array computation just as
 if it were scalar computation.

 Basically what I need is ZipList-like Applicative instances for vectors
 and Repa arrays. Why not they support ZipVector? Because 'pure' of zipList
 was an infinite list and you can't do infinite vectors. Then I came up with
 this idea.

 https://gist.github.com/4162375

 the wrapper W does several things: it represents the 'pure,' homogeneous
 array in a space-efficient manner, and also serves as a newtype-wrapper of
 Num (and possibly Fractional, Floating...) instances.

 Questions are: is this technology new? or promising? doomed?
 It seems to me like a free-Applicative, like the free-Monad theory. Are
 they related?
 The function 'backend' helps to mix in the non-zip-like computations. How
 can we remove the 'undefined' in the 'backend?'
 Some of Repa computations are Monads. W needs to be a monad transformer to
 incooperate this.

 Also I'm grateful to past cafe discussion on existing Zippable
 implementations [3][4] .

 [1] hackage.haskell.org/package/repa
 [2] http://hackage.haskell.org/package/Paraiso
 [3] http://www.haskell.org/pipermail/haskell-cafe/2009-July/064403.html
 [4]
 http://hackage.haskell.org/packages/archive/category-extras/latest/doc/html/Control-Functor-Zip.html


 --
 Takayuki MURANUSHI
 The Hakubi Center for Advanced Research, Kyoto University
 http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html




-- 
Takayuki MURANUSHI
The Hakubi Center for Advanced Research, Kyoto University
http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] computation over containers, greatly simplified notation.

2012-11-30 Thread Jason Dagit
You might find this paper an interesting read: http://www.brics.dk/RS/01/10/

On Fri, Nov 30, 2012 at 4:43 PM, Takayuki Muranushi muranu...@gmail.comwrote:

 Dear everyone,

 After a number of attempts [1] I'm starting to think that my initial
 approach was ill-directed.

 After all, Functor, Applicative, Zip are three different classes.
 Functors are type constructors where you can map unary functions over them.
 Applicatives are those with map-over of zero-ary functions (pure,) unary
 functions, binary functions, ternary functions, ... etc.
 Zip are those with unary, binary, ternary ... mapover, but not zero-ary
 map-over.

 Repa Arrays and Vectors belong to Zip because there's no trivial unique
 way to implement pure.

 What the customer really needed [2] seems to be the following series of
 functions:


 forLiftZ1 :: Zip f = f a - (a - b) - f b

 forLiftZ2 :: Zip f = f a - f b - (a - b - c) - f c


 forLiftZ3 :: Zip f = f a - f b - f c - (a - b - c - d) - f d

 Now I'm trying if it's possible to implement the series in a single shot
 [3] .

 I'm reporting my progress for anyone who might be still thinking for me.
 Thank you!!

 [1] https://github.com/nushio3/practice/tree/master/free-objects
 [2] http://www.projectcartoon.com/cartoon/3
 [3]
 https://github.com/nushio3/practice/blob/master/free-objects/printf6.hs




 2012/11/29 Takayuki Muranushi muranu...@gmail.com

 Dear all,

 I came up with an idea to greatly simplify some kinds of array
 computations. It should work well with many kinds of arrays. Is this new?

 https://gist.github.com/4162375



 These few days, I've been trying to rewrite a hydrodynamic simulation
 code that used Data.Vector (~250 lines), to Repa [1] . It seemed promising,
 but soon I realized that I needed to use Repa.map and Repa.zipWith almost
 everywhere. I need careful thinking to transform every lines (that used
 vector's indexing) to Repa's point-free stile. Is there any better ways?

 Then I realized that I was the author of Paraiso [2], a DSL for stencil
 computation. One of its feature is to write down array computation just as
 if it were scalar computation.

 Basically what I need is ZipList-like Applicative instances for vectors
 and Repa arrays. Why not they support ZipVector? Because 'pure' of zipList
 was an infinite list and you can't do infinite vectors. Then I came up with
 this idea.

 https://gist.github.com/4162375

 the wrapper W does several things: it represents the 'pure,' homogeneous
 array in a space-efficient manner, and also serves as a newtype-wrapper of
 Num (and possibly Fractional, Floating...) instances.

 Questions are: is this technology new? or promising? doomed?
 It seems to me like a free-Applicative, like the free-Monad theory. Are
 they related?
 The function 'backend' helps to mix in the non-zip-like computations. How
 can we remove the 'undefined' in the 'backend?'
 Some of Repa computations are Monads. W needs to be a monad transformer
 to incooperate this.

 Also I'm grateful to past cafe discussion on existing Zippable
 implementations [3][4] .

 [1] hackage.haskell.org/package/repa
 [2] http://hackage.haskell.org/package/Paraiso
 [3] http://www.haskell.org/pipermail/haskell-cafe/2009-July/064403.html
 [4]
 http://hackage.haskell.org/packages/archive/category-extras/latest/doc/html/Control-Functor-Zip.html


 --
 Takayuki MURANUSHI
 The Hakubi Center for Advanced Research, Kyoto University
 http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html




 --
 Takayuki MURANUSHI
 The Hakubi Center for Advanced Research, Kyoto University
 http://www.hakubi.kyoto-u.ac.jp/02_mem/h22/muranushi.html

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe