При игре с Pointfree мне был представлен фрагмент кода, который я не могу понять.
:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]
Моя основная проблема заключается в том, что я не понимаю, как работает join. Я понимаю, что он "удаляет" один слой монадической упаковки (m (m a) to m a). Я полагаю, что это сводится к чему-то вроде [1..10] >>= (\x -> [x * x]), но я действительно не понимаю, как вводится "дополнительный слой". Я получаю этот join x = x >>= id, но затем я все еще зацикливаюсь на том, как это "дублирует" каждое значение, так что (*) получает два аргумента. Меня это беспокоило примерно полчаса, и я в основном раздражаюсь, потому что чувствую, что у меня есть все части головоломки, но, похоже, они не подходят друг к другу...
P.S. Не волнуйтесь, я бы действительно не использовал эту версию с плавающей точкой, это чисто любопытство и попытка лучше понять Haskell.