Когда я играл с 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.