Это min
определение ниже работает с двумя церковными числами и возвращает наименьшее значение. Каждое число становится продолжением, которое отправляет свое предысторию другому, зигзагообразно и загадочно, до тех пор, пока не будет достигнут ноль. Более того, одно из чисел добавляет f к результату каждый раз, когда он вызывается, так что в итоге у вас будет (\ f x -> f (... (f (f x)) ...))
, где число 'f справа - это количество раз, когда было вызвано первое продолжение.
min a b f x = (a_continuator b_continuator)
a_continuator = (a (\ pred cont -> (cont pred)) (\ cont -> x))
b_continuator = (b (\ pred cont -> (f (cont pred))) (\ cont -> x))
Похоже, что min
нельзя набрать в System-F. Например, чтобы запустить его на GHC, мне пришлось дважды использовать unsafeCoerce
:
import Unsafe.Coerce
(#) = unsafeCoerce
min' = (\ a b f x -> (a (\ p c -> (c # p)) (\ c -> x) (b (\ p c -> (f (c # p))) (\ c -> x))))
toInt = (\ n -> (n (+ 1) 0))
main = print (toInt (min'
(\ f x -> (f (f (f (f (f x)))))) -- 5
(\ f x -> (f (f (f (f (f (f (f (f x)))))))))) -- 8
:: Int)
Можно ли ввести min
в System-F (или в исчислении конструкций)?
(cont -> x)
. Есть еще\
? - person chi   schedule 18.11.2015CN = forall a. (a->a)->a->a
. Поскольку политипы не могут быть выведены, я бы начал с аннотирования числовых переменных с помощьюCN
- есть вероятность, что вы используете их в разных типах. - person chi   schedule 18.11.2015T
(которое может применяться только к функциямT->T
) - однако это ограничение очень неудобно. В языке с политипами вы можете присвоить типCN
числам, чтобы они могли работать с любой функцией типаT->T
, независимо от типаT
. - person chi   schedule 18.11.2015a (\ p c -> c p)
нельзя ввести в SystemF (даже после добавления некоторых параметров типа). Его тип, кажется, зависит от фактического значенияa
. Я предполагаю, что в CoC его можно ввести, но только после добавления не просто переменных типа / аргументов типа, но и других терминов, которые кодируют зависимость результирующего типа отa
. - person chi   schedule 18.11.2015GHC.Generics
и его использовании. Для более сложных универсальных юниверсов вы можете посмотреть this или это. - person András Kovács   schedule 19.11.2015