2016-04-17 4 views

ответ

2

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

dlToList = ($[]) . unDL 
dlToList dl = (($[]) . unDL) dl 

Затем вы начинаете применять к композиции цепи, справа налево:

dlToList dl = ($[]) (unDL dl) 

После этого вы можете распаковать операторскую секцию & dagger;

dlToList dl = unDL dl $ [] 

Однако, сохраняя ($[]), как это на самом деле имеет смысл, потому что это важен конвертер между разностными списками и обычными списками: он принимает [a]->[a] -prepender-функцию и применяет его к терминатору [], в результате чего в конкретном списке.


& dagger; Мы могли бы упростить, что дальше:

dlToList dl = unDL dl [] 

, который, кстати, может быть точка снова свободна в более короткие образом:

dlToList = (`unDL`[]) 

+0

Также вы можете объяснить мне, как делает это работает? 'emptyDL :: DList a' ' emptyDL = DL id' –

+0

Пустой список различий - это функция добавления списка, которая, передавая (пустой) список терминаторов, просто даст тот же список, что и результат. – leftaroundabout

+0

Но если мы посмотрим на типы, 'DL :: ([a] -> [a]) -> DList a' и' id :: a -> a' –