Помощь в понимании без разбора code

Когда я играл с Pointfree , мне представили фрагмент кода, который Кажется, я не понимаю.

:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]

Моя основная проблема в том, что я не понимаю, как здесь работает join . Я понимаю, что он «удаляет» один слой монадической оболочки ( m (m a) до m a ). Я полагаю, это сводится к чему-то вроде [1..10] >> = (\ x -> [x * x]) , но я действительно не понимаю, как вводится "дополнительный слой" . Я получаю, что join x = x >> = id , но я все еще не могу понять, как это «дублирует» каждое значение, так что (*) получает два аргумента. Это меня беспокоит уже около получаса, и я больше всего злюсь на себя, потому что чувствую, что у меня есть все кусочки пазла, но я не могу соединить их вместе ...

P.S. Не волнуйтесь, я бы не стал использовать эту бесточечную версию, это чистое любопытство и попытка лучше понять Haskell.

17
задан Michael Kohl 22 July 2011 в 23:45
поделиться