Y Combinator на Haskell

Можно ли написать Y Combinator на Haskell?

Похоже, он будет иметь бесконечно рекурсивный тип.

 Y :: f -> b -> c
 where f :: (f -> b -> c)

или что-то в этом роде. Даже простой слегка факториал с факториалом

factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)

{- to be called as
(factMaker factMaker) 5
-}

терпит неудачу с "Проверка на наличие: невозможно построить бесконечный тип: t = t -> t2 -> t1"

(Комбинатор Y выглядит так

(define Y
    (lambda (X)
      ((lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg))))
       (lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg)))))))

на схеме) б -> в) или что-то в этом роде. Даже простой ...

Можно ли написать Y Combinator на Haskell?

Похоже, он будет иметь бесконечно рекурсивный тип.

 Y :: f -> b -> c
 where f :: (f -> b -> c)

или что-то в этом роде. Даже простой слегка факториал с факториалом

factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)

{- to be called as
(factMaker factMaker) 5
-}

терпит неудачу с "Проверка на наличие: невозможно построить бесконечный тип: t = t -> t2 -> t1"

(Комбинатор Y выглядит так

(define Y
    (lambda (X)
      ((lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg))))
       (lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg)))))))

на схеме) б -> в) или что-то в этом роде. Даже простой ...

Можно ли написать Y Combinator на Haskell?

Похоже, он будет иметь бесконечно рекурсивный тип.

 Y :: f -> b -> c
 where f :: (f -> b -> c)

или что-то в этом роде. Даже простой слегка факториал с факториалом

factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)

{- to be called as
(factMaker factMaker) 5
-}

терпит неудачу с "Проверка на наличие: невозможно построить бесконечный тип: t = t -> t2 -> t1"

(Комбинатор Y выглядит так

(define Y
    (lambda (X)
      ((lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg))))
       (lambda (procedure)
         (X (lambda (arg) ((procedure procedure) arg)))))))

на схеме) Или, более кратко, как

(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
        (λ (x) (f (λ (a) ((x x) a))))))

Для аппликативного порядка И

(λ (f) ((λ (x) (f (x x)))
        (λ (x) (f (x x)))))

Это всего лишь сокращение eta для ленивой версии.

Если вы предпочитаете короткие имена переменных.

47
задан Theo Belaire 12 October 2012 в 13:53
поделиться