2015-04-15 3 views
1

Учитывая следующий Typeclassopedia упражнения:Монада Transformer «распространять» Функция

--Implement join :: M (N (M (N a))) -> M (N a), 
--given distrib :: N (M a) -> M (N a) and 
--assuming M and N are instances of Monad. 

distrib :: (Monad m, Monad n) => n (m a) => m (n a) 
distrib = undefined 

я получаю ошибку времени компиляции.

ghci> :l MonadTransformers.hs 
[1 of 1] Compiling Main    (MonadTransformers.hs, interpreted) 

MonadTransformers.hs:7:34: 
    Expected a constraint, but `n (m a)' has kind `*' 
    In the type signature for `distrib': 
     distrib :: (Monad m, Monad n) => n (m a) => m (n a) 
Failed, modules loaded: none. 

Как его разрешить?

ответ

3

Это должно быть

distrib :: (Monad m, Monad n) => n (m a) -> m (n a) 

=> идет между ограничением и остальной частью типа.

-> - конструктор типа infix для функций.

Например

(+) :: Num a => a -> a -> a 
     -----  \/ \ 
     \   arguments result 
     constraint 
+2

виню Scala ~~ ~~ (я) для '=>'. Спасибо –

+0

Кевин Мередит: Да, я думаю, это не помогает в Scala, ограничения (неявные) аргументы. – rampion

+0

Являются ли ограничения разрешены как имплицитные в Haskell? –

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