alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Scala example source code file (depmet_implicit_oopsla_zipwith.scala)

This example Scala source code file (depmet_implicit_oopsla_zipwith.scala) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Scala tags/keywords

a, b, b, c, n, r, s, s, stream, stream, succ, t, zipwith, zipwith

The Scala depmet_implicit_oopsla_zipwith.scala source code

case class Zero()
case class Succ[N](x: N)
import Stream.{cons, continually}

trait ZipWith[N, S] {
  type T

  def manyApp: N => Stream[S] => T
  def zipWith: N => S => T = n => f => manyApp(n)(continually(f))
}
object ZipWith {
  implicit def ZeroZipWith[S] = new ZipWith[Zero, S] {
    type T = Stream[S]

    def manyApp = n => xs => xs
  }

  implicit def SuccZipWith[N, S, R](implicit zw: ZipWith[N, R]) = 
    new ZipWith[Succ[N],S => R] {
      type T = Stream[S] => zw.T

      def zapp[A, B](xs: Stream[A => B], ys: Stream[A]): Stream[B] = (xs, ys) match {
        case (cons(f, fs), cons(s, ss)) => cons(f(s),zapp(fs, ss))
        case (_, _) => Stream.empty
      }

      def manyApp = n => xs => ss => n match {
        case Succ(i) => zw.manyApp(i)(zapp(xs, ss))
      }
    }
}

object Test {
  def zWith[N, S](n: N, s: S)(implicit zw: ZipWith[N, S]): zw.T = zw.zipWith(n)(s)

  def zipWith0: Stream[Int] = zWith(Zero(),0) 

// (Stream[A]) => java.lang.Object with ZipWith[Zero,B]{type T = Stream[B]}#T
// should normalise to: Stream[A] => Stream[B]
  def map[A, B](f: A => B) = zWith(Succ(Zero()),f)
                               
  def zipWith3[A, B, C, D](f: A => B => C => D) = //: Stream[A] => Stream[B] => Stream[C] => Stream[D] = // BUG why do we need a return type?
    zWith(Succ(Succ(Succ(Zero()))),f)
}

Other Scala examples (source code examples)

Here is a short list of links related to this Scala depmet_implicit_oopsla_zipwith.scala source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.