I've encountered a typing error that I'm not sure how to track down. I assume that what I'm doing is running up against the limitations of the type system, so I assume there is some technical detail that I am missing. Here's my problem:
type ('a,'b) result_stream =
('a -> ('a,'b) result_stream -> 'b) ->
(unit -> 'b) -> 'b
let stream_declarations (type a)
: (internal_result,a) result_stream = ...
(* I am unable to implement this function *)
let generic_search_stream (type b) (glnumopt : int option)
: (internal_result, b) result_stream =
stream_declarations
Ocaml complains with the following error message:
Error: This expression has type
(internal_result, b) result_stream =
(internal_result -> (internal_result, b) result_stream -> b) ->
(unit -> b) -> b
but an expression was expected of type
(internal_result, b) result_stream =
(internal_result -> (internal_result, b) result_stream -> b) ->
(unit -> b) -> b
The type constructor b would escape its scope
Since the types match up exactly, I can only assume that this has something to do with the type declaration (type b) but I can't see what is wrong. My expectation is that the scope of [b] ends at the end of the [generic_search_stream] function and is used as the type parameter to [stream_declarations], this seems to not be the case though.
Wondering if OCaml requires arguments in order to instantiate polymorphic functions, I tried to eta-expand the definition as follows:
let generic_search_stream (type b) (glnumopt : int option)
: (internal_result, b) result_stream =
fun cons nil -> stream_declarations cons nil
With this code, the "error" is with 'cons' and says:
Error: This expression has type
internal_result -> (internal_result, b) result_stream -> b
but an expression was expected of type
internal_result -> (internal_result, b) result_stream -> b
Type
(internal_result, b) result_stream =
(internal_result -> (internal_result, b) result_stream -> b) ->
(unit -> b) -> b
is not compatible with type
(internal_result, b) result_stream =
(internal_result -> (internal_result, b) result_stream -> b) ->
(unit -> b) -> b
The type constructor b would escape its scope
Essentially the same error, but it doesn't seem to lead me to any potential solutions.
Can someone explain this error to me?
Thanks.
--
gregory malecha