{"action":"created","issue":{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/216","labels_url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/216/labels{/name}","comments_url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/216/comments","events_url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/216/events","html_url":"https://github.com/GL-MPRI-2014/Ocawai/issues/216","id":55553410,"number":216,"title":"Problème avec `assoc_t` ?","user":{"login":"iSheeft","id":5960860,"avatar_url":"https://avatars.githubusercontent.com/u/5960860?v=3","gravatar_id":"","url":"https://api.github.com/users/iSheeft","html_url":"https://github.com/iSheeft","followers_url":"https://api.github.com/users/iSheeft/followers","following_url":"https://api.github.com/users/iSheeft/following{/other_user}","gists_url":"https://api.github.com/users/iSheeft/gists{/gist_id}","starred_url":"https://api.github.com/users/iSheeft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iSheeft/subscriptions","organizations_url":"https://api.github.com/users/iSheeft/orgs","repos_url":"https://api.github.com/users/iSheeft/repos","events_url":"https://api.github.com/users/iSheeft/events{/privacy}","received_events_url":"https://api.github.com/users/iSheeft/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/labels/bug","name":"bug","color":"fc2929"},{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/labels/help%20wanted","name":"help wanted","color":"159818"},{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/labels/script","name":"script","color":"fbca04"},{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/labels/wontfix","name":"wontfix","color":"ffffff"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":8,"created_at":"2015-01-26T23:30:00Z","updated_at":"2015-01-27T13:45:40Z","closed_at":null,"body":"On dirait que j'ai cassé *master* avec mon *occurs check* et mes modifications du *type checker*.\r\n\r\nJ'ai cependant du mal à comprendre l'erreur…\r\nLe *type checker* donne une erreur de typage qui est réelle :\r\n```bash\r\nError in ./resources/scripts/olive.script, from line 159:3851 to line 159:3851: function assoc_get of type (('a0 -> 'a1 -> unit) * (('a1 -> 'a2) -> (unit -> 'a2) -> 'a0 -> 'a2)) -> ('a1 -> 'a2) -> (unit -> 'a2) -> 'a0 -> 'a2 cannot be applied to parameters of types \r\n((soldier -> soldier -> unit) * ((soldier -> (int * int) list) -> (unit -> (int * int) list) -> soldier -> (int * int) list)), \r\nsoldier -> soldier, \r\nunit -> _'a79, \r\nsoldier, \r\nit doesn't match\r\n```\r\n\r\nAvec ces types là, ça ne marche pas en effet… `bound` est bien de type `soldier -> soldier`, mais le reste est plus embêtant à typer à la main pour voir s'il y a un problème…\r\n\r\nJ'ai par contre un souci avec le type `assoc_t`.\r\nSi on l'écrit comme suit :\r\n```ocaml\r\ntype setter = key -> val -> unit\r\ntype getter = (val -> 'a) -> (unit -> 'a) -> key -> 'a\r\ntype assoc_t = setter * getter\r\n```\r\n\r\nÇa semble convenir, mais tout est traité de la même façon (`'a` comme `key` ou `val`), or, on voudrait pouvoir changer le `'a` à la volée pour une même valeur de type `assoc_t` mais pas pouvoir changer `key` ou `val`.\r\nPour résumer, ne faudrait-il pas que le type soit paramétrique comme les listes ?\r\n\r\nBien sûr, on ne peut pas faire de type paramétrique dans notre langage, donc je comprends la notation…\r\nMais peut-être qu'en rendant le type checker un peu moins laxiste, je l'ai en quelque sorte obligé à fixer `key` et `val`, mais aussi `'a` du même coup…\r\n\r\nQue faire ?"},"comment":{"url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/comments/71649381","html_url":"https://github.com/GL-MPRI-2014/Ocawai/issues/216#issuecomment-71649381","issue_url":"https://api.github.com/repos/GL-MPRI-2014/Ocawai/issues/216","id":71649381,"user":{"login":"iSheeft","id":5960860,"avatar_url":"https://avatars.githubusercontent.com/u/5960860?v=3","gravatar_id":"","url":"https://api.github.com/users/iSheeft","html_url":"https://github.com/iSheeft","followers_url":"https://api.github.com/users/iSheeft/followers","following_url":"https://api.github.com/users/iSheeft/following{/other_user}","gists_url":"https://api.github.com/users/iSheeft/gists{/gist_id}","starred_url":"https://api.github.com/users/iSheeft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iSheeft/subscriptions","organizations_url":"https://api.github.com/users/iSheeft/orgs","repos_url":"https://api.github.com/users/iSheeft/repos","events_url":"https://api.github.com/users/iSheeft/events{/privacy}","received_events_url":"https://api.github.com/users/iSheeft/received_events","type":"User","site_admin":false},"created_at":"2015-01-27T13:45:40Z","updated_at":"2015-01-27T13:45:40Z","body":"Le problème ne se pose pas en fait. Il suffit de faire un `try with` pour agir en conséquence. Il n'y a pas besoin de la référence.\r\nLe problème qui risque d'intervenir en revanche c'est que si quelqu'un fait `snd` sur un `assoc_t` (et ça type parce que ce n'est pas caché) il risque une exception…"}}