foldl с монадой

87 views
Skip to first unread message

Grigory Fateyev

unread,
Dec 1, 2014, 7:48:05 AM12/1/14
to haskell...@googlegroups.com
Добрый день!

Прохожу курс FP101x и возник затык с монадами, задание такое:

Implement the function foldLeftM :: Monad m => (a -> b -> m a) -> a ->
[b] -> m a that takes an accumulation function a -> b -> m a, and a
seed of type a and left folds a finite, non-partial list of non-bottom
elements of type b into a single result of type m a

Hint: The recursive structure of foldLeftM looks as follows:

foldLeftM f a [] = ... a ...
foldLeftM f a (x:xs) = foldLeftM f (... f ... a ... (>> ...) xs

Я написал:

foldLeftM f a [] = a
foldLeftM f a (x:xs) = foldLeftM f (f a x >>= \r -> return r) xs

но проверочный тест падает:

*Main> foldLeftM (\a b -> putChar b >> return (b : a ++ [b])) [] "haskell" >>= \r -> putStrLn r

<interactive>:4:45:
Couldn't match expected type `[Char]' with actual type `IO [Char]'
In the first argument of `(++)', namely `a'
In the second argument of `(:)', namely `a ++ [b]'
In the first argument of `return', namely `(b : a ++ [b])'

Простите, я новичок в хаскель и не совсем понимаю что пишу :).

Спасибо!
--
Best regards!
gfborn [at] gmail [dot] com

Nickolay Kudasov

unread,
Dec 1, 2014, 7:56:19 AM12/1/14
to haskell...@googlegroups.com
Добрый день!

Проблема не в тесте, foldLeftM, который Вы написали имеет совсем не тот тип, который вы хотите.

Hints:
- выпишите реализацию в отдельном файле с явной сигнатурой типа (то, что сейчас у Вас есть не скомпилируется);
- follow the types;
- f a x >>= \r -> return r    =    f a x

Успехов

1 декабря 2014 г., 15:48 пользователь Grigory Fateyev <gfb...@gmail.com> написал:
--
Вы получили это сообщение, поскольку подписаны на группу Русский Haskell.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/20141201154801.64860955%40gmail.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages