* [Caml-list] ocaml{c,opt} choked
@ 2014-01-25 18:39 Matej Kosik
2014-01-25 20:10 ` Nicolas Braud-Santoni
0 siblings, 1 reply; 3+ messages in thread
From: Matej Kosik @ 2014-01-25 18:39 UTC (permalink / raw)
To: caml-list
Hi,
I am using ocaml 4.01.0.
I have noticed the following strange behavior:
When I try to compile this fragment:
(irrelevant parts of the original program were removed)
let a b = b []
let c _ _ d = d []
let _ = a c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
it takes 11 seconds to complete.
This fragment.
let a b = b []
let c _ _ d = d []
let _ = a c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
c ""
compiles in 22 seconds.
This fragment:
let a b = b []
let c _ _ d = d []
let _ = a c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
c "" c "" c "" c "" c "" c "" c "" c "" c "" c "" c ""
c "" c ""
compiles in 44 seconds.
I would like to ask: is this is a known phenomenon?
-------------------------------------------------------------------
The context:
I have started to apply the advice given here:
https://sympa.inria.fr/sympa/arc/caml-list/2013-11/msg00207.html
That way I've got terms with which ocaml{c,opt} struggles.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Caml-list] ocaml{c,opt} choked
2014-01-25 18:39 [Caml-list] ocaml{c,opt} choked Matej Kosik
@ 2014-01-25 20:10 ` Nicolas Braud-Santoni
2014-01-25 20:59 ` Simon Cruanes
0 siblings, 1 reply; 3+ messages in thread
From: Nicolas Braud-Santoni @ 2014-01-25 20:10 UTC (permalink / raw)
To: caml-list
[-- Attachment #1: Type: text/plain, Size: 1085 bytes --]
On 25/01/2014 19:39, Matej Kosik wrote:
> Hi,
>
> I am using ocaml 4.01.0.
>
> I have noticed the following strange behavior:
> [...]
>
> I would like to ask: is this is a known phenomenon?
> -------------------------------------------------------------------
> The context:
>
> I have started to apply the advice given here:
> https://sympa.inria.fr/sympa/arc/caml-list/2013-11/msg00207.html
> That way I've got terms with which ocaml{c,opt} struggles.
Hi,
It is a well-known problem that type inference is exponential-type[0]
This worst-case behaviour is triggered when you have deeply nested -> in
the types.
For an example, consider :
let f x y = y x x in
let g x = f (f x) in
let h x = g (g x) in
let h x = h (h x) in
let h x = h (h x) in
h;; (* This actually causes a stack overflow *)
Unfortunately, there isn't (as far as I know) a silver bullet.
Avoiding deep nesting of combinators mights be a solution, though.
I usually also helps with readability.
Regards,
Nicolas
[0] under ETH, probably, but I don't currently remember.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Caml-list] ocaml{c,opt} choked
2014-01-25 20:10 ` Nicolas Braud-Santoni
@ 2014-01-25 20:59 ` Simon Cruanes
0 siblings, 0 replies; 3+ messages in thread
From: Simon Cruanes @ 2014-01-25 20:59 UTC (permalink / raw)
To: Nicolas Braud-Santoni, Nicolas Braud-Santoni, caml-list
[-- Attachment #1: Type: text/plain, Size: 1281 bytes --]
I'm not sure that it's the source of the issue, but is this exponential behaviour caused by the unification algorithm?
Nicolas Braud-Santoni <nicolas.braudsantoni@gmail.com> a écrit :
>On 25/01/2014 19:39, Matej Kosik wrote:
>> Hi,
>>
>> I am using ocaml 4.01.0.
>>
>> I have noticed the following strange behavior:
>> [...]
>>
>> I would like to ask: is this is a known phenomenon?
>> -------------------------------------------------------------------
>> The context:
>>
>> I have started to apply the advice given here:
>> https://sympa.inria.fr/sympa/arc/caml-list/2013-11/msg00207.html
>> That way I've got terms with which ocaml{c,opt} struggles.
>
>Hi,
>
>It is a well-known problem that type inference is exponential-type[0]
>This worst-case behaviour is triggered when you have deeply nested ->
>in
>the types.
>
>For an example, consider :
>
>let f x y = y x x in
>let g x = f (f x) in
>let h x = g (g x) in
>let h x = h (h x) in
>let h x = h (h x) in
>h;; (* This actually causes a stack overflow *)
>
>
>Unfortunately, there isn't (as far as I know) a silver bullet.
>Avoiding deep nesting of combinators mights be a solution, though.
>I usually also helps with readability.
>
>Regards,
>Nicolas
>
>[0] under ETH, probably, but I don't currently remember.
--
Simon
[-- Attachment #2: Type: text/html, Size: 1849 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-01-25 20:59 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-25 18:39 [Caml-list] ocaml{c,opt} choked Matej Kosik
2014-01-25 20:10 ` Nicolas Braud-Santoni
2014-01-25 20:59 ` Simon Cruanes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox