¿Por qué la función de elección no determinista en la biblioteca estándar de Curry no se define directamente sino con una función auxiliar de 2 argumentos?

Considere una funciónchoose inCurry lenguaje de programación con la especificación que "(choose xs) elige de forma no determinista un elemento de la listaxs ".

Lo implementaría directamente a través de dos reglas alternativas no deterministas:

choose :: [a] -> a
choose x:_ = x
choose _:xs = choose xs

Pero en /usr/lib/curry-0.9.11/Success.curry deMuenster Curry Compiler, se define con una función auxiliar:

choose (x:xs) = choosep x xs
  where choosep x [] = x
        choosep x (_:_) = x
        choosep _ (x:xs) = choosep x xs

¿Cuáles podrían ser las ventajas (si las hay) de la definición del módulo proporcionado por el compilador? ¿Son las 2 definiciones completamente equivalentes (incluso en algunos casos difíciles con no determinismo y valores indefinidos)? ¿Es una de ellas más eficiente en algunos casos?

ADDED: Mayor consideración

cthom06 (¡Gracias!) ha señalado correctamente que mi definición provocaría golpear el valor indefinido en muchos más casos (porque intentaríamos llamar a esta función con un argumento de lista vacía una vez por cada llamada de "nivel superior" con un argumento de lista inicialmente no vacía). (Hm, ¿por qué no he notado esta consideración de inmediato? ...) Eso es menos eficiente.

Pero me pregunto: ¿hay alguna diferencia semántica? ¿Puede la diferencia ser importante en algunos contextos difíciles?

Vemos que la diferencia entre las dos definiciones, en el caso de listas no vacías, básicamente se reduce a la diferencia entre dos definiciones potenciales paraid:

mi definición es como definirid como

id x = x
id _ = undefined

y su definición es como definigid la forma normal:

id x = x

(Entonces, aquí se revierte la sencillez).

¿En qué contextos puede ser importante?

Respuestas a la pregunta(1)

Su respuesta a la pregunta