#scala #function #recursion #types
#scala #функция #рекурсия #типы
Вопрос:
Я хотел бы в scala определить тип функции примерно так:
type RFcn: () => RFcn
но я не могу понять синтаксис, чтобы заставить его работать. Кто-нибудь знает, как это сделать?
Ответ №1:
Ответ Сарвеша вызвал что-то в моем сознании, что дало мне то, что я хотел. Это довольно просто:
abstract class RFcn extends Function0[RFcn]
Это делает то, что я пытался выразить.
Ответ №2:
Хорошо… дело в том, что a recursive function
не должен возвращать a function
. И это type RFcn = () => RFcn
не похоже на рекурсивную функцию. Итак, ваш вопрос, похоже, вдохновлен небольшим непониманием рекурсивных функций и является некорректным.
Это type RFcn = () => RFcn
больше похоже на наивную попытку реализовать состояние, представляющее некоторый шаг в potential Bottom
(читается как потенциально бесконечное вычисление). И если это то, что вам нужно, вы можете соответствующим образом изменить свой вопрос, и, возможно, что-то вроде a State monad
может быть вам полезно.
Не позволяет перейти к части, на которую можно ответить. В Scala функции фактически являются экземплярами Function1
, Function2
… и т.д. Итак, если вы хотите иметь тип, который представляет функцию от единицы к функции, вы можете написать следующим образом,
type UnitToFunc1[P1, R] = () => Function1[P1, R]
type UnitToFunc2[P1, P2, R] = () => Function2[P1, P2, R]
Комментарии:
1. Это тип, который я хочу быть рекурсивным, а не функция. Прочитайте заголовок как «Рекурсивный (тип функции)», а не «тип (рекурсивная функция)». Дело не в том, что мне нужно, чтобы она возвращала функцию, а в том, что я хочу, чтобы она возвращала функцию, которая возвращает функцию, которая возвращает функцию….
2. И это именно то, что я пытаюсь вам сказать… Я думаю, вы хотите реализовать потенциальное дно. Вы не можете напрямую представлять дно на любом языке, полном по Тьюрингу (и Scala является одним из них), и, таким образом, люди приближают их к потенциальным днищам. И монада состояния может использоваться для реализации потенциального дна.
3. Теперь вы можете спросить, что я подразумеваю под потенциальным дном — потенциальное дно или потенциальное бесконечное вычисление — это состояние этого бесконечного вычисления в любой момент времени. Здесь важно отметить, что, хотя конечный результат бесконечного вычисления не может быть представлен, вы можете представить его промежуточное состояние в любой момент времени. А затем просто используйте это как отложенный генератор для текущих состояний.
4. Нет опасности бесконечной рекурсии — она не выполняет возвращаемое значение, она просто возвращает его.
5. Хорошо… Когда вы это сказали
I want it to return a function that returns a function that returns a function....
, я не понимаю, чем это отличается от бесконечной оценки. Я предоставил вам все, что, я думаю, вам нужно было знать… пытаетесь ли вы понять это или нет, зависит от вас.