{"action":"created","issue":{"url":"https://api.github.com/repos/rust-lang/rfcs/issues/105","labels_url":"https://api.github.com/repos/rust-lang/rfcs/issues/105/labels{/name}","comments_url":"https://api.github.com/repos/rust-lang/rfcs/issues/105/comments","events_url":"https://api.github.com/repos/rust-lang/rfcs/issues/105/events","html_url":"https://github.com/rust-lang/rfcs/pull/105","id":34910422,"number":105,"title":"RFC: Add unboxed, abstract return types","user":{"login":"aturon","id":709807,"avatar_url":"https://avatars.githubusercontent.com/u/709807?v=3","gravatar_id":"","url":"https://api.github.com/users/aturon","html_url":"https://github.com/aturon","followers_url":"https://api.github.com/users/aturon/followers","following_url":"https://api.github.com/users/aturon/following{/other_user}","gists_url":"https://api.github.com/users/aturon/gists{/gist_id}","starred_url":"https://api.github.com/users/aturon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aturon/subscriptions","organizations_url":"https://api.github.com/users/aturon/orgs","repos_url":"https://api.github.com/users/aturon/repos","events_url":"https://api.github.com/users/aturon/events{/privacy}","received_events_url":"https://api.github.com/users/aturon/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":138,"created_at":"2014-06-03T22:24:29Z","updated_at":"2015-08-18T02:03:13Z","closed_at":"2014-06-06T16:37:41Z","pull_request":{"url":"https://api.github.com/repos/rust-lang/rfcs/pulls/105","html_url":"https://github.com/rust-lang/rfcs/pull/105","diff_url":"https://github.com/rust-lang/rfcs/pull/105.diff","patch_url":"https://github.com/rust-lang/rfcs/pull/105.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/rust-lang/rfcs/issues/comments/132032617","html_url":"https://github.com/rust-lang/rfcs/pull/105#issuecomment-132032617","issue_url":"https://api.github.com/repos/rust-lang/rfcs/issues/105","id":132032617,"user":{"login":"Ericson2314","id":1055245,"avatar_url":"https://avatars.githubusercontent.com/u/1055245?v=3","gravatar_id":"","url":"https://api.github.com/users/Ericson2314","html_url":"https://github.com/Ericson2314","followers_url":"https://api.github.com/users/Ericson2314/followers","following_url":"https://api.github.com/users/Ericson2314/following{/other_user}","gists_url":"https://api.github.com/users/Ericson2314/gists{/gist_id}","starred_url":"https://api.github.com/users/Ericson2314/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ericson2314/subscriptions","organizations_url":"https://api.github.com/users/Ericson2314/orgs","repos_url":"https://api.github.com/users/Ericson2314/repos","events_url":"https://api.github.com/users/Ericson2314/events{/privacy}","received_events_url":"https://api.github.com/users/Ericson2314/received_events","type":"User","site_admin":false},"created_at":"2015-08-18T02:03:13Z","updated_at":"2015-08-18T02:03:13Z","body":"@glaebhoerl with the naive existential encoding, since `bar` is working from the existential type, it itself uses has an existential type, and the `foo` looks at bar and also sees an abstracted type that `foo` has no idea has anything to do with itself.\r\n\r\nWe can bail ourselves out by making `foo : ∃ FooReal. (() -> FooReal) -> { ...}`. Then \"hoisting\" the existential over `bar` and `foo` together while doing a letrec to tie the not. In other words, modules can cyclically reference each other in the definition of their terms, but not their types.\r\n\r\nMy guess is that what I just said is extremely cryptic, but if you read the paper up to the point where they talk about a Monad from hoisting the existential, it should make sense. The order of monadic binds should be a topological sort over the acyclic type-level modules dependencies."}}