Что означает ">> =" в этой позиции (haskell) - PullRequest
0 голосов
/ 08 мая 2020
ans=0:(join(iterate(>>=(\x->[x+1,1/(1+1/x)]))root)>>=(\x->[-x,x]))

Код, который я показываю выше, выполняет функцию, которая генерирует список рациональных чисел. У меня вопрос: что означает >> = между iterate ( и (\ x -> ... .

Если я удалю «>> =» (т.е. итерация (\ x -> [x + 1,1 / (1 + 1 / x)]) root), я получу сообщение об ошибке.

ERROR file:2.hs:5 - Type error in application
*** Expression     : iterate (\x -> [x + 1,1 / (1 + 1 / x)]) root
*** Term           : \x -> [x + 1,1 / (1 + 1 / x)]
*** Type           : Ratio Integer -> [Ratio Integer]
*** Does not match : [Ratio Integer] -> [Ratio Integer]

Кто-нибудь может объясните мне это?

Я знаю кое-что о Монаде из Haskell, и я встречал только несколько простых примеров, таких как

a >> = b >> = c

Заранее спасибо за вашу доброту.

1 Ответ

4 голосов
/ 08 мая 2020

Это большая вершина c, но в данном контексте оба использования: (>>=) = flipconcatMap; просто 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...