On Wed, Aug 10, 2011 at 6:14 PM, Brian Hurt <bhur...@gmail.com> wrote:
> And what can I say about an element I've taken off a list of x-or-ys,
> say by using List.head?  Without doing some sort of run time type
> identification, or having a type system that is complex enough to keep
> track of which elements in the list are xs and which are ys (which is
> a way more complicated type system than Ocaml, Haskell, or Scala-
> we're talking Coq, Twelf, or similar at this point).

It's actually fairly straightforward to define such types in Haskell
and Scala (and possibly OCaml, but I'm not sufficiently familiar with
OCaml to say either way with any confidence). Google for HList (for
"Heterogenous List").

Here's how it goes (in somewhat simplified form) in Scala,

trait HList

case class HCons[H, T <: HList](head : H, tail : T) extends HList {
  def ::[T](v : T) = HCons(v, this)
  override def toString = head+" :: "+tail.toString
}

class HNil extends HList {
  def ::[T](v : T) = HCons(v, this)
  override def toString = "HNil"
}

case object HNil extends HNil

type ::[H, T <: HList] = HCons[H, T]
val :: = HCons

And here's a sample session in the Scala REPL ... note how the element
type is tracked through calls to head and tail,

scala> val l = 1 :: true :: "foo" :: HNil
l: HCons[Int,HCons[Boolean,HCons[java.lang.String,HNil]]] =
  1 :: true :: foo :: HNil

scala> l.head
res0: Int = 1

scala> l.tail.head
res1: Boolean = true

scala> l.tail.tail.head
res2: java.lang.String = foo

Cheers,


Miles

-- 
Miles Sabin
tel: +44 7813 944 528
gtalk: mi...@milessabin.com
skype: milessabin
http://www.chuusai.com/
http://twitter.com/milessabin

-- 
You received this message because you are subscribed to the Google Groups "JVM 
Languages" group.
To post to this group, send email to jvm-languages@googlegroups.com.
To unsubscribe from this group, send email to 
jvm-languages+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/jvm-languages?hl=en.

Reply via email to