2014-10-15 7 views
0

Я учусь монады в Haskell и я анализирую этот пример (http://learnyouahaskell.com/a-fistful-of-monads):Как работает эта простая цепочечная привязка?

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

Я хотел бы понять, что происходит в этой части функции:

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

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

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

Но это не похоже на выход тот же результат, делая полное выражение.

EDIT 1:

Принимая во внимание ответ ниже полный скобок является:

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

Который привел меня, чтобы получить эту составленную функцию:

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

Будьте осторожны с термином «частичной оценки». Это технический термин, который не связан с чем-либо, происходящим здесь. (Это метод оптимизации.) – Carl

+0

Исправленная терминология к одному, я думаю, правильно отражает поведение. – OneEyeQuestion

ответ

3

Это на самом деле бит, отличный от этого. Скобок следующим образом

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

Или, если вы предпочитаете

let step1 n = 
    let step2 ch = return (n, ch) 
    in ['a','b'] >>= step2 
in [1,2] >>= step1 
+0

Хорошо. Теперь я вижу, что полная скобка: «[1,2] >> = (\ n -> (['a', 'b'] >> = \ c -> return (n, c))). Но если я попытаюсь частично составить его, я думаю, что получаю: '[1,2] >> = (\ n -> [(n, ['a', 'b'])])', но это не кажется, имеет смысл. Можете ли вы опубликовать, как проводится оценка? Я имею в виду простой перечень шагов, которые происходят. – OneEyeQuestion

+0

Хитрость заключается в том, что частичная композиция должна выполняться путем «отслаивания слоев снаружи». Последние шаги в монадической последовательности привязки все имеют смысл сами по себе, но первые не ... по крайней мере, если только вы не заполните отверстие «возвратом». –

+0

Во втором фрагменте выше слово 'n' в' step2' фактически не связано. – chi