On Tue, Apr 13, 2010 at 1:09 PM, Robby Findler <[email protected]> wrote: >> >> What if we change the contract to: >> >> ((list/c any/c any/c) . -> . any/c) >> >> Now the error case is unreachable, but `match' doesn't know that. >> This also suggests that almost every single use of `match-let' should >> trigger a warning. > > We would presumably just follow ml in this case.
I don't know what this means. For example, the OCaml code: match (x : (int,int)) with (7,z) -> ... | (_,z) -> ... is complete, and therefore no warning would be issued. If you use general list patterns in OCaml: match (x : int list) with [7,z] -> ... | [_,z] -> ... you'll get a warning about pattern incompleteness. I don't think this warning is useful, given the contract I specified. Further, ML checks the completeness of patterns in `let' using the type system, which `match' can't do. For example, this code: (match-let ([(list x ...) (map add1 some-list]) ...) clearly doesn't cover the case where `map' doesn't produce a list. That's impossible, but `match-let' doesn't know that, so it would have to issue a warning. Would you find that warning useful? I don't think I would. -- sam th [email protected] _________________________________________________ For list-related administrative tasks: http://list.cs.brown.edu/mailman/listinfo/plt-dev
