Как я могу определить тип рекурсивной функции в scala?

#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.... , я не понимаю, чем это отличается от бесконечной оценки. Я предоставил вам все, что, я думаю, вам нужно было знать… пытаетесь ли вы понять это или нет, зависит от вас.