Por que a função de escolha não determinística na lib std de Curry não é definida diretamente, mas com uma função auxiliar de 2 argumentos?

Considere uma funçãochoose noLinguagem de programação Curry com a especificação de que "(choose xs) escolhe não deterministicamente um elemento da listaxs"

Eu o implementaria diretamente através de duas regras não determinísticas alternativas:

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

Mas em /usr/lib/curry-0.9.11/Success.curry deMuenster Curry Compiler, é definido com uma função auxiliar:

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

Quais poderiam ser as vantagens (se houver) da definição do módulo fornecido pelo compilador? As 2 definições são completamente equivalentes (mesmo em alguns casos complicados com não-determinismo e valores indefinidos)? .. Uma delas é mais eficiente em alguns casos?

ADICIONADO: Consideração mais profunda

cthom06 (Obrigado!) apontou corretamente que minha definição causaria atingir o valor indefinido em muito mais casos (porque tentaríamos chamar essa função com um argumento de lista vazia uma vez por cada chamada de "nível superior" com uma chamada inicial). argumento de lista não vazia). (Hum, por que não percebi essa consideração imediatamente?) Isso é menos eficiente.

Mas eu me pergunto: existem diferenças semânticas? A diferença pode ser importante em alguns contextos complicados?

Vemos que a diferença entre as duas definições - no caso de listas não vazias - se resume basicamente à diferença entre duas definições possíveis paraid:

minha definição é como definirid Como:

id x = x
id _ = undefined

e sua definição é como definigid da maneira normal:

id x = x

(Então, aqui a objetividade é revertida.)

Em quais contextos isso pode ser importante?

questionAnswers(1)

yourAnswerToTheQuestion