2016-08-13 2 views
1

Я недавно читал узнать вам Haskell, и я наткнулся на выражении:Haskell Монада реализация

[1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch) 

этих выражениях возвращает результат

[(1,'a'),(1,'b'),(2,'a'),(2,'b')] 

так я понимаю, что монадическая привязка для списков осуществляются следующим образом:

xs >>= f = concatMap f xs 

Принимая первую половину выражения, а именно:

[1,2] >>= \n -> ['a', 'b'] 

он оценивает в ['a','b','a','b'], от того, что я понимаю, это затем подается в функцию: (\ch -> return (n , ch)).

Что я не понимаю, так это то, как значения 1,2 из списка присваиваются n, а затем как компилятор ведет запись, а затем назначает ему n в последней функции?

+0

*** Опуская явные скобки в изучении материала Зла *** Слишком жесткая? Спросите бесчисленных новичков, которые теряют бесчисленные часы из-за этого. –

ответ

7

Первая половина не то, что вы думаете, круглые скобки, как это:.

[1,2] >>= (\n -> ['a', 'b'] >>= (\ch -> return (n, ch))) 
+1

Возможно, вы захотите упомянуть, что это связано с тем, что лямбда-выражения всегда идут как можно дальше вправо. – dfeuer

Смежные вопросы