Pergunta

Como iniciante na OCAML, tenho esse código de trabalho atual:

...
let ch_in = open_in input_file in
try
    proc_lines ch_in
with End_of_file -> close_in ch_in;;

Agora eu gostaria de adicionar o manuseio de erros para arquivos de entrada inexistentes, escrevi isso:

let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> try proc_lines x with End_of_file -> close_in x
| None -> () ;;

e receba uma mensagem de erro: Esse padrão corresponde aos valores do tipo 'a opção, mas é aqui usado para corresponder a valores do tipo exn para a última linha. Se eu substituir Nenhum por _, Recebo um erro sobre a correspondência incompleta.

Eu li que exn é o tipo de exceção. Tenho certeza de que não entendo o que realmente está acontecendo aqui, então me aponte para a direção certa. Obrigado!

Foi útil?

Solução

Ao incorporar o padrão de incorporação em outras correspondências de padrões, você precisa envolver a correspondência incorporada com qualquer um ( ... ) ou begin ... end (açúcar sintático para parênteses):

let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> (try proc_lines x with End_of_file -> close_in x)
| None -> () ;;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top