Хорошо, я делаю снимок. Не стесняйтесь поправлять меня, потому что я не эксперт в этом.
Для произвольных x
и xs
, он должен быть так, что toList (\c n -> c x xs)
сводится к термину, который способен переходить в x : toList xs
.
Это возможно, только если мы уменьшим левую сторону до c x xs
, применив (\c n -> c x xs)
к некоторым c
и n
. Итак, toList ~ (\f -> f ? ?)
. (Кстати, это та часть, где я не мог придумать хороший строгий аргумент, у меня были некоторые идеи, но у меня не было ничего хорошего. Я был бы рад услышать подсказки).
Теперь это должно быть так, что c x xs ~ (x : toList xs)
. Но так как x
и xs
представляют собой различные универсальные переменные, и они являются единственными переменными, входящими в правую сторону, уравнение находится в Miller's pattern fragment, и поэтому c ~ (\x xs -> x : toList xs)
является его наиболее общим решением.
Таким образом, toList
должен уменьшиться до (\f -> f (\x xs -> x : toList xs) n)
для некоторых n
. Очевидно, что toList
не может иметь нормальную форму, так как мы всегда можем развернуть рекурсивное возникновение.
Для этого конкретного списка да, он существует. Но вы, безусловно, имеете в виду функцию, которая может принимать _any_ такой список, сколь угодно долго и возвращает стандартный список, не так ли? – chi
Да, вот что я имею в виду. – MaiaVictor
Разве это не '\ c n -> c 3 (\ c n -> n)' в конце списка? –