* [Caml-list] Is arrow programming impossible in ocaml? @ 2003-10-13 23:59 Nick Name 2003-10-14 1:33 ` Oleg Trott 2003-10-14 10:37 ` skaller 0 siblings, 2 replies; 9+ messages in thread From: Nick Name @ 2003-10-13 23:59 UTC (permalink / raw) To: caml-list Hi all, I am trying to work on a project where I need ocaml efficiency with rank-2 polymorphism, if I got it correctly (I am not an expert in programming language semantics). Basically I am trying to reproduce FRAN-like usage of arows as in http://haskell.cs.yale.edu/yampa/AFPLectureNotes.pdf so I have defined my own arrow module etc, but I faced the rank-1 polymorphism restriction of ocaml. I have cut down my example to: - type ('a,'b) t = 'a -> 'b let rec arr f = f let a = arr (fun x -> x) - and "a" is typed like '_a -> '_a , where I would like it to be typed 'a -> 'a. Does anyone think I have other possibilities in writing that kind of higher-order combinator based code, or is it impossible? thanks Vincenzo ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-13 23:59 [Caml-list] Is arrow programming impossible in ocaml? Nick Name @ 2003-10-14 1:33 ` Oleg Trott 2003-10-14 3:02 ` Jacques Garrigue 2003-10-14 10:37 ` skaller 1 sibling, 1 reply; 9+ messages in thread From: Oleg Trott @ 2003-10-14 1:33 UTC (permalink / raw) To: Nick Name, caml-list On Monday 13 October 2003 07:59 pm, Nick Name wrote: > Hi all, I am trying to work on a project where I need ocaml efficiency > with rank-2 polymorphism, if I got it correctly (I am not an expert in > programming language semantics). > > Basically I am trying to reproduce FRAN-like usage of arows as in > > http://haskell.cs.yale.edu/yampa/AFPLectureNotes.pdf > > so I have defined my own arrow module etc, but I faced the rank-1 > polymorphism restriction of ocaml. I have cut down my example to: > > - > type ('a,'b) t = 'a -> 'b > > let rec arr f = f > > let a = arr (fun x -> x) > - > > and "a" is typed like '_a -> '_a , where I would like it to be typed 'a > -> 'a. I think OCaml 3.07 makes this possible > Does anyone think I have other possibilities in writing that kind of > higher-order combinator based code, or is it impossible? > > thanks > > Vincenzo -- Oleg Trott <oleg_trott@columbia.edu> ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-14 1:33 ` Oleg Trott @ 2003-10-14 3:02 ` Jacques Garrigue 2003-10-14 11:26 ` Nick Name 0 siblings, 1 reply; 9+ messages in thread From: Jacques Garrigue @ 2003-10-14 3:02 UTC (permalink / raw) To: oleg_trott; +Cc: nick.name, caml-list From: Oleg Trott <oleg_trott@columbia.edu> > On Monday 13 October 2003 07:59 pm, Nick Name wrote: > > Hi all, I am trying to work on a project where I need ocaml efficiency > > with rank-2 polymorphism, if I got it correctly (I am not an expert in > > programming language semantics). > > > > Basically I am trying to reproduce FRAN-like usage of arows as in > > > > http://haskell.cs.yale.edu/yampa/AFPLectureNotes.pdf > > > > so I have defined my own arrow module etc, but I faced the rank-1 > > polymorphism restriction of ocaml. I have cut down my example to: Looking at your example, this doesn't seem to be a problem with rank-2 polymorphism, but just one instance of the value restriction. (See the FAQ on caml.inria.fr) > > - > > type ('a,'b) t = 'a -> 'b > > > > let rec arr f = f > > > > let a = arr (fun x -> x) > > - > > > > and "a" is typed like '_a -> '_a , where I would like it to be typed 'a > > -> 'a. > > I think OCaml 3.07 makes this possible Unfortunately, no. OCaml 3.07 recovers polymorphism only if 'a appears only in covariant positions, and here it appears in both covariant and contravariant position. But as long as you represent arrows by normal functions (as this seems to be the case in the paper), eta-expanding should solve the problem. let a y = arr (fun x -> x) y Not also that there is no problem if Arr is a constructor: type ('a,'b) = Arr of ('a -> 'b) let a = Arr (fun x -> x) Jacques Garrigue ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-14 3:02 ` Jacques Garrigue @ 2003-10-14 11:26 ` Nick Name 2003-10-15 0:22 ` Jacques Garrigue 0 siblings, 1 reply; 9+ messages in thread From: Nick Name @ 2003-10-14 11:26 UTC (permalink / raw) To: caml-list Alle 05:02, martedì 14 ottobre 2003, Jacques Garrigue ha scritto: > But as long as you represent arrows by normal functions (as this > seems to be the case in the paper), eta-expanding should solve the > problem. > Unfortunately I can't; I am using arrows to hide a function-like structure wich is more complex than functions > let a y = arr (fun x -> x) y > > Not also that there is no problem if Arr is a constructor: I can't do this in general, either, because I need the (>>>) combinator, wich represents (reverse) function composition, so type ('a,'b) t = Arr of ('a -> 'b) | Seq of ((('a,'c) t) * (('c,'b) t)) where Seq is the composition, is not writeable because I would need to make 'c a parameter for t, and then ('a,'c) t would no longer be valid etc. Do anyone see another solution? Thanks & bye Vincenzo ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-14 11:26 ` Nick Name @ 2003-10-15 0:22 ` Jacques Garrigue 2003-10-15 1:53 ` Nick Name 0 siblings, 1 reply; 9+ messages in thread From: Jacques Garrigue @ 2003-10-15 0:22 UTC (permalink / raw) To: nick.name; +Cc: caml-list From: Nick Name <nick.name@inwind.it> > Alle 05:02, martedì 14 ottobre 2003, Jacques Garrigue ha scritto: > > But as long as you represent arrows by normal functions (as this > > seems to be the case in the paper), eta-expanding should solve the > > problem. > > > > Unfortunately I can't; I am using arrows to hide a function-like > structure wich is more complex than functions > > > let a y = arr (fun x -> x) y > > > > Not also that there is no problem if Arr is a constructor: > > I can't do this in general, either, because I need the (>>>) combinator, > wich represents (reverse) function composition, so > > type ('a,'b) t = Arr of ('a -> 'b) | Seq of ((('a,'c) t) * (('c,'b) t)) > > where Seq is the composition, is not writeable because I would need to > make 'c a parameter for t, and then ('a,'c) t would no longer be valid > etc. > > Do anyone see another solution? I'm afraid you will have to state in more detail what you want to do. Or to show some Haskell code. What you try to do may or may not be possible, but I don't think that the value restriction is essential to your problem. In a first step I suppose you could assume that you have no polymorphic identity, just identity functions at every type. Jacques ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-15 0:22 ` Jacques Garrigue @ 2003-10-15 1:53 ` Nick Name 2003-10-15 2:20 ` Jacques Garrigue 0 siblings, 1 reply; 9+ messages in thread From: Nick Name @ 2003-10-15 1:53 UTC (permalink / raw) To: caml-list Alle 02:22, mercoledì 15 ottobre 2003, Jacques Garrigue ha scritto: > I'm afraid you will have to state in more detail what you want to do. > Or to show some Haskell code. Here it is: module type ARROW = sig type ('a,'b) t val arr : ('a -> 'b) -> ('a,'b) t val (>>>) : ('a,'b) t -> ('b,'c) t -> ('a,'c) t val (&&&) : ('a,'b) t -> ('a,'c) t -> ('a,('b * 'c)) t end module Time : sig include ARROW val time : ('a,float) t val run : (unit,'a) t -> float -> 'a option val const : 'a -> ('b,'a) t end = struct type state = (float * float) (* A signal transformer is a function wich takes the current time (and dt) and maybe returns a value, or stops with None *) type ('a,'b) t = T of ((state * 'a) -> (('b * ('a,'b) t) option)) let rec arr f = T (fun (_,x) -> Some (f x,arr f)) let rec (>>>) (T a1) (T a2) = T (fun (s,x) -> match a1 (s,x) with None -> None | Some (r1,n1) -> match a2 (s,r1) with None -> None | Some (r2,n2) -> Some (r2,n1 >>> n2)) let rec (&&&) (T a1) (T a2) = T (fun arg -> match (a1 arg,a2 arg) with ((None,_)|(_,None)) -> None | (Some (r1,n1),Some (r2,n2)) -> Some ((r1,r2),n1 &&& n2)) let rec time = T (fun ((t,_),_) -> Some (t,time)) let run (T f) t = match f ((t,0.0),()) with None -> None | Some (r,_) -> Some r let const x = arr (fun _ -> x) end (* now in the toplevel # let t = time >>> time;; val t : ('_a, float) Var.Time.t = <abstr> *) Well, that '_a is exactly what I wish to avoid; I had this suggestion privately (with simplified type declarations): # type ('a,'b) sf = Arr of ('a * float -> 'b);; type ('a, 'b) sf = Arr of ('a * float -> 'b) # let (>>>) f1 f2 = match f1(),f2() with (Arr f1),(Arr f2) -> Arr (fun (a,s) -> f2 (f1(a,s),s));; val ( >>> ) : (unit -> ('a, 'b) sf) -> (unit -> ('b, 'c) sf) -> ('a, 'c) sf = <fun> # let time () = Arr (fun (_,t) -> t);; val time : unit -> ('a, float) sf = <fun> # let t () = time >>> time;; val t : unit -> ('a, float) sf = <fun> and yet I don't know if it's satisfactory, however I realize that this is a general problem with caml view of polymorphism, probably driven by type-inference decidability issues; in fact I can't write a polymorphic compose operator in general, because I will get exactly the same problems. Vincenzo ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-15 1:53 ` Nick Name @ 2003-10-15 2:20 ` Jacques Garrigue 2003-10-15 11:39 ` skaller 0 siblings, 1 reply; 9+ messages in thread From: Jacques Garrigue @ 2003-10-15 2:20 UTC (permalink / raw) To: nick.name; +Cc: caml-list From: Nick Name <nick.name@inwind.it> > Here it is: > > module type ARROW = > sig > type ('a,'b) t > > val arr : ('a -> 'b) -> ('a,'b) t > val (>>>) : ('a,'b) t -> ('b,'c) t -> ('a,'c) t > val (&&&) : ('a,'b) t -> ('a,'c) t -> ('a,('b * 'c)) t > end [...] > (* now in the toplevel > > # let t = time >>> time;; > val t : ('_a, float) Var.Time.t = <abstr> *) > > Well, that '_a is exactly what I wish to avoid; I see. > I had this suggestion privately (with simplified type declarations): > > # type ('a,'b) sf = Arr of ('a * float -> 'b);; > type ('a, 'b) sf = Arr of ('a * float -> 'b) > # let (>>>) f1 f2 = match f1(),f2() with (Arr f1),(Arr f2) -> Arr (fun > (a,s) -> f2 (f1(a,s),s));; > val ( >>> ) : (unit -> ('a, 'b) sf) -> (unit -> ('b, 'c) sf) -> ('a, 'c) > sf = > <fun> > # let time () = Arr (fun (_,t) -> t);; > val time : unit -> ('a, float) sf = <fun> > # let t () = time >>> time;; > val t : unit -> ('a, float) sf = <fun> > > and yet I don't know if it's satisfactory. What would be the problem? This is just about delaying the arrow construction, to make sure that no side-effect may occur. > however I realize that this > is a general problem with caml view of polymorphism, probably driven by > type-inference decidability issues; in fact I can't write a polymorphic > compose operator in general, because I will get exactly the same > problems. This has nothing to do with decidability at all! Again, this is the value restriction, which solves a problem with soundness in presence of side-effects, and this is a FAQ. And you can perfectly define a polymorphic compose operator. # let compose f g x = f (g x);; val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun> The only difficulty is that to create polymorphic functions with this operator you must apply eta-expansion. # let swap (x,y) = (y,x);; val swap : 'a * 'b -> 'b * 'a = <fun> # fun p -> compose swap swap p;; - : 'a * 'b -> 'a * 'b = <fun> By the way, if you are ready to break abstraction (which in your case doesn't seem essential), you can build a t with the right polymorphic type: # let t = T(fun s -> let T a = time >>> time in a s);; val t : ('a, float) Var.Time.t = ... Not very clean, but you can replace time >>> time by any polymorphic expression. It can be made a bit simpler by using a record instead of a sum: # let t = {f=fun s -> (time >>> time).f s};; Jacques Garrigue ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-15 2:20 ` Jacques Garrigue @ 2003-10-15 11:39 ` skaller 0 siblings, 0 replies; 9+ messages in thread From: skaller @ 2003-10-15 11:39 UTC (permalink / raw) To: Jacques Garrigue; +Cc: nick.name, caml-list On Wed, 2003-10-15 at 12:20, Jacques Garrigue wrote: > From: Nick Name <nick.name@inwind.it> > By the way, if you are ready to break abstraction (which in your case > doesn't seem essential), you can build a t with the right polymorphic > type: > # let t = T(fun s -> let T a = time >>> time in a s);; > val t : ('a, float) Var.Time.t = ... > Not very clean, but you can replace time >>> time by any polymorphic > expression. The cleanliness can be had with camlp4 surely? ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Is arrow programming impossible in ocaml? 2003-10-13 23:59 [Caml-list] Is arrow programming impossible in ocaml? Nick Name 2003-10-14 1:33 ` Oleg Trott @ 2003-10-14 10:37 ` skaller 1 sibling, 0 replies; 9+ messages in thread From: skaller @ 2003-10-14 10:37 UTC (permalink / raw) To: Nick Name; +Cc: caml-list On Tue, 2003-10-14 at 09:59, Nick Name wrote: > Hi all, I am trying to work on a project where I need ocaml efficiency > type ('a,'b) t = 'a -> 'b > > let rec arr f = f > > let a = arr (fun x -> x) > - > > and "a" is typed like '_a -> '_a , where I would like it to be typed 'a > -> 'a. > > Does anyone think I have other possibilities in writing that kind of > higher-order combinator based code, or is it impossible? It works fine with an annotation: # type ('a,'b) t = 'a -> 'b let rec arr f = f let a = arr (fun x -> x) ;; type ('a, 'b) t = 'a -> 'b val arr : 'a -> 'a = <fun> val a : '_a -> '_a = <fun> # let a:('a,'a) t = (fun x -> x) ;; val a : ('a, 'a) t = <fun> # a 1;; - : int = 1 # a 1.1;; - : float = 1.1 # ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2003-10-15 11:40 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-10-13 23:59 [Caml-list] Is arrow programming impossible in ocaml? Nick Name 2003-10-14 1:33 ` Oleg Trott 2003-10-14 3:02 ` Jacques Garrigue 2003-10-14 11:26 ` Nick Name 2003-10-15 0:22 ` Jacques Garrigue 2003-10-15 1:53 ` Nick Name 2003-10-15 2:20 ` Jacques Garrigue 2003-10-15 11:39 ` skaller 2003-10-14 10:37 ` skaller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox