Явная рекурсия типов в F # - PullRequest
7 голосов
/ 10 августа 2009

Вдохновлен этим вопросом :

Возможна ли явная рекурсия типа в F #?

type 'a Mu = In of 'a Mu 'a

let unIn (In x) = x

Этот код, к сожалению, дает «Параметр типа нельзя использовать в качестве конструктора типа.

Примечания: эта конструкция используется в статье Функциональное программирование с перегрузкой и полиморфизмом высшего порядка , например.

Пример использования (взято из здесь ):

type ('a, 'b) ListX =
    | Nil
    | Cons of 'a * 'b

type 'a List = ListX Mu

1 Ответ

8 голосов
/ 10 августа 2009

Нет, это невозможно. В частности, дженерики в F # имеют то же ограничение, что и CLR, а именно или <'a> должны иметь вид "*". Это то же самое ограничение, которое означает, что вы не можете создавать "классы типов" непосредственно в F #, например, «Monad m» будет принимать аргумент с большим родом «m» (например, «* -> *», где, например, «list» и «option» могут быть экземплярами, каждый из которых является конструктором универсального типа), но это недопустимо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...