Это большая вершина c, но в данном контексте оба использования: (>>=) = flip
concatMap
; просто concatMap
с аргументами в обратном порядке. Это своего рода «обобщенное декартово произведение», которое выполняет итерацию по каждому элементу списка слева, возвращая, возможно, несколько результатов для каждого элемента и объединяя все результаты вместе.
ghci> [1,2,3] >>= (\x -> [x,-x])
[1,-1,2,-2,3,-3]
ghci> [2,1] >>= \x -> [(x,'a'),(x,'b'),(x,'c')]
[(2,'a'),(2,'b'),(2,'c'),(1,'a'),(1,'b'),(1,'c')]
ghci> [1..10] >>= \x -> if even x then [x] else []
[2,4,6,8,10]
Видите?
Похоже, что вы тоже раньше не видели раздел оператора ? В Haskell мы можем опустить одну из сторон оператора, и это создает функцию, которая частично применяет оператор. Например:
ghci> f = (/3)
ghci> f 6
2.0
ghci> g = ([1,2] >>=)
ghci> g (\x -> [x,-x])
[1,-1,2,-2]
Итак, (>>= (\x -> [x+1, 1/(1+1/x)]))
- это функция, которая принимает список чисел и для каждого числа генерирует как x+1
, так и 1/(1+1/x)
.