Мой другой комментарий применим и здесь: Разница заключается в (числе) промежуточных решениях, в том, как работает интерпретатор, возможно, в побочных эффектах (воспринимайте «ошибку» как побочный эффект), но, вероятно, не в полной мере. вычисленный результат, если не было какого-то инкапсулированного поиска. Кроме того, лень играет роль, и, возможно, могут быть различия в (количестве) выходных решений, если мы берем только «голову» выражения, не нажимая «undefined» / error.

отрим функциюchoose вЯзык программирования карри с указанием, что "(choose xs) недетерминированно выбирает один элемент из спискаxs».

Я реализовал бы это прямо через два альтернативных недетерминированных правила:

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

Но в /usr/lib/curry-0.9.11/Success.curry изMuenster Curry Compilerопределяется с помощью вспомогательной функции:

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

Какие могут быть преимущества (если таковые имеются) определения из поставляемого компилятором модуля? Являются ли эти 2 определения полностью эквивалентными (даже в некоторых сложных случаях с недетерминизмом и неопределенными значениями)? .. Является ли одно из них более эффективным в некоторых случаях?

ДОБАВЛЕНО: более глубокое рассмотрение

cthom06 (спасибо!) правильно указал, что мое определение вызовет попадание в неопределенное значение в гораздо большем числе случаев (потому что мы будем пытаться вызывать эту функцию с аргументом пустого списка один раз для каждого нашего вызова «верхнего уровня» с первоначально непустой аргумент списка). (Хм, почему я не заметил это соображение сразу? ..) Это менее эффективно.

Но мне интересно: есть ли смысловые различия? Может ли разница быть важной в некоторых сложных ситуациях?

Мы видим, что разница между двумя определениями - в случае непустых списков - в основном сводится к разнице между двумя потенциальными определениями дляid:

мое определение похоже на определениеid как:

id x = x
id _ = undefined

и их определение как определid нормальный способ:

id x = x

(Итак, здесь прямолинейность обращена вспять.)

В каких контекстах это может быть важно?

Ответы на вопрос(1)

Ваш ответ на вопрос