Я экспериментирую с Haskell Control.Monad.State
, пытаясь перебрать список строк или целых чисел, подсчитывая их и заменяя строковые записи целым числом 0
.Мне удалось сделать подсчет части, но не удалось создать замененный список.Вот мой код, который правильно выводит [3,6]
на экран.Как я могу заставить его создать нужный список [6,0,3,8,0,2,9,1,0]
?
module Main( main ) where
import Control.Monad.State
l = [
Right 6,
Left "AAA",
Right 3,
Right 8,
Left "CCC",
Right 2,
Right 9,
Right 1,
Left "D"]
scanList :: [ Either String Int ] -> State (Int,Int) [ Int ]
scanList [ ] = do
(ns,ni) <- get
return (ns:[ni])
scanList (x:xs) = do
(ns,ni) <- get
case x of
Left _ -> put (ns+1,ni)
Right _ -> put (ns,ni+1)
case x of
Left _ -> scanList xs -- [0] ++ scanList xs not working ...
Right i -> scanList xs -- [i] ++ scanList xs not working ...
startState = (0,0)
main = do
print $ evalState (scanList l) startState