Первая строка в вашем операторе do
завершается неудачно, потому что вы пытаетесь использовать tail
для IO [String]
.Вам нужно fmap
функция tail
:
contents <- fmap tail . fmap lines . readFile $ "testInput"
-- or....
contents <- fmap (tail . lines) . readFile $ "testInput"
Теперь вам нужен способ получить каждую вторую строку из contents
.Вы можете определить простую everyOther
функцию для этого:
everyOther :: [a] -> [a]
everyOther (x:_:xs) = x : everyOther xs
everyOther _ = []
И теперь вы можете добавить это в свой fmap
в первой строке:
contents <- fmap (everyOther . tail . lines) . readFile $ "testInput"
Ваш waffles
Функция (row - 1)*(col - 1)
, похоже, не связана с тем, что, как я считаю, должно быть подписью типа.Попробуйте начать с подписи типа и построения waffles
из их.Исходя из вашего описания, вы просто предоставляете каждую строку для функции, поэтому она должна иметь подпись:
waffles :: String -> String
Учитывая, что подпись типа для waffles
, вы можете применить ее через:
let result = fmap waffles contents
Еще одна вещь на выходе: concat
смоет все строки вместе.Вам, вероятно, нужны разрывы строк, поэтому вы можете использовать unlines
.
main = do
contents <- fmap (everyOther . tail . lines) . readFile $ "testInput"
let result = fmap waffles contents
writeFile "output.txt" $ unlines result