2013-02-23 2 views
3

Этот вопрос из статьи "Тривиальная Монада" найден в http://blog.sigfpe.com/2007/04/trivial-monad.html. Условии ответКак вы определяете функцию сигнатуры h :: M Int -> M Int -> M Int, так что h (M x) (M y) = M (x + y) без разворачивания монады?

h x y = x >>= (\x -> g x y) 

или, что эквивалентно (в контексте статьи)

h :: W Int -> W Int -> W Int 
h x y = bind (\x-> g x y) x 

где g-

g :: Int -> W Int -> W Int 
g x y = y >>= (return . (+x)) 

для монады:

data W a = W a deriving Show

Теперь я немного смущен, как вы можете положить x в g, если в качестве первого параметра требуется Int, но x is W Int?

ответ

7

Теперь я немного смущен, как вы можете поместить x в g, если он принимает Int как первый параметр, но x является M Int?

Есть две различные переменные x, а внутренняя - затенение внешнего внутри лямбда-выражения. Четкий способ написать код будет нечто вроде

h mx my = mx >>= (\x -> g x my) 
+4

+1 для трицератопса – chibro2

7

Missingno отметил важный шаг, но ответ на титульной вопрос: liftM2 (+).

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