Lo que estás tratando de hacer se llama un patrón de igualdad, y no lo proporciona Objective Caml. Los patrones de Object Caml son estáticos y puramente estructurales. Es decir, si un valor coincide con el patrón depende únicamente de la estructura del valor, y de una manera que se determina en tiempo de compilación. Por ejemplo, (_, _)::tail
es un patrón que coincide con cualquier lista no vacía cuyo encabezado es un par. (identifier, value)::tail
coincide exactamente con los mismos valores; la única diferencia es que este último une dos nombres más identifier
y value
.
Aunque algunos idiomas tienen patrones de igualdad, existen consideraciones prácticas no triviales que los hacen problemáticos. Cual igualdad? Igualdad física (==
en Ocaml), igualdad estructural (=
en Ocaml), o alguna igualdad personalizada dependiente del tipo? Además, en Ocaml, hay una indicación sintáctica clara de qué nombres son carpetas y qué nombres son referencia de valores previamente encuadernados: cualquier identificador de minúsculas en un patrón es un encuadernador. Estas dos razones explican por qué Ocaml no tiene patrones de igualdad integrados. La forma idiomática de expresar un patrón de igualdad en Ocaml está en guardia. De esta forma, queda inmediatamente claro que la coincidencia no es estructural, que identifier
no está vinculado por esta coincidencia de patrón, y que igualdad está en uso. En cuanto a lo feo, eso está en el ojo del espectador: como programador habitual de Ocaml, encuentro que los patrones de igualdad son feos (por las razones anteriores).
match bindings with
| (id, value)::tail when id = identifier -> value
| (_, _)::tail -> getValue identifier tail
| [] -> -1
En F #, que tienen otra posibilidad: active patterns, que le permiten predefinir los guardias que se refieren a un solo sitio en un patrón.
Su enfoque original me recuerda la unificación de Prolog, es bastante declarativo que funcional. – ron