Estou tentando usar a scanl
função em Haskell. Reduzi meu problema, que pode ser descrito nos dois casos a seguir, que podem ser executados no interpretador usando apenas uma biblioteca normal dentro de Haskell que contém o (observe que não estou necessariamente scanl
interessado no valor monádico aqui, mas apenas como usar scanl
para garantir uma consistência de tipo):
Por que o seguinte com Right value
o trabalho pré-listado funciona:
*Defs> scanl (\x acc -> x ++ acc) [] [[(Right 1)], [(Right 2)]]
[[],[Right 1],[Right 1,Right 2]]
quando isso não funciona e causa a seguinte mensagem de erro:
*Defs> scanl (\x acc -> [x] ++ acc) [] [(Right 1), (Right 2)]
<interactive>:36:35: error:
* Couldn't match expected type `[[a]]'
with actual type `Either a0 b0'
...
Acho que você trocou o valor e o acumulador. Considere o tipo de
scanl
:O valor do acumulador é do tipo
b
. Ele vem primeiro.Se você trocar os argumentos em seu segundo exemplo, funcionará:
Você também pode trocar o argumento do primeiro exemplo, e isso também funciona: