2015-12-07 3 views
0

Я тестировал следующие реализацииHaskell различных реализаций sequence_

sequence_' :: Monad m => [m a] -> m() 

sequence_'b [] = return() 
sequence_'b (m : ms) = (foldl (>>) m ms) >> return() 

sequence_'d [] = return() 
sequence_'d (m : ms) = m >> sequence_'d ms 

sequence_'e [] = return() 
sequence_'e (m : ms) = m >>= \ _ -> sequence_'e ms 

sequence_'g ms = foldr (>>) (return()) ms 

Чтобы проверить это, я использовал следующее:

sequence_'e [putChar 'a', putChar 'b', putChar 'c'] 

и

sequence_'e [getChar, getChar, getChar] 

Вышеуказанные тесты работали. Первый поместил значение abc на экран HUGS, и курсор вернется к следующей строке.

Второй принят тремя символами, напечатанными на экране HUGS, и курсор возвращается к следующей строке.

Просьба предложить больше тестов, которые я мог бы выполнить для проверки этих реализаций sequence_ (я предполагаю, что это последовательность Monad).

Благодаря

ответ

2

Это обычно хорошо, чтобы проверить, что происходит с бесконечными списками в Haskell

sequence_ (repeat (putChar 'a')) 

и ленивых монады как Writer

import Control.Monad.Writer 
execWriter (sequence_ (repeat (tell "a"))) 

Если моя интуиция правильно, вы должны увидеть по крайней мере, одно различие между вашими реализациями с этими случаями.

О, и только для того, чтобы исправить ваш словарный запас. sequence - это просто функция (некоторые называют ее «монадической функцией»). Вот несколько диаграмм о том, где находится настоящая монада:

putChar :: Char -> IO () 
        ^^ 
        monad 

tell :: w -> Writer w () 
      ^^^^^^^^ 
       monad 

sequence_ :: (Monad m) => [m a] -> m() 
        ^ ^ ^
        +------+-------+ 
          monad 
+0

Я использую HUGS. Я думаю, что это Haskell 98. –

+0

У меня возникла следующая ошибка, когда я попытался импортировать Control.Monad.Writer через сценарий. Файл ERROR: {Hugs} \ packages \ mtl \ Control \ Monad \ Reader.hs: 47 - Haskell 98 не поддерживает зависимые параметры –

+0

Ой, попробуйте Control.Monad.Trans.Writer, тогда я думаю. Trans - это пакет трансформаторов, который не использует столько пугающих функций – luqui

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