Я получаю текст из .txt, обрабатываю его. Я получаю гласные и их количество из текста. Я не могу записать список кортежей [(Char, Int)] в текстовый файл. Я хочу, чтобы в каждой строке была буква и ее номер, но я никак не могу это написать.
`
import Data.List
import Char
add :: Eq a => a -> [(a, Int)] -> [(a, Int)]
add x [] = [(x, 1)]
add x ((y, n):rest) = if x == y
then (y, n+1) : rest
else (y, n) : add x rest
count :: Eq a => [a] -> [(a, Int)]
count = sortBy f . foldr add [] where
f (_, x) (_, y) = compare y x
ff x = filter (\x->elem (fst x) "aeyioAEYIO") x
fff x = ff (count x)
main :: IO ()
main = do
src <- readFile "input.txt"
writeFile "output.txt" (operate src)
operate :: [(Char, Int)] -> String
operate = fff
Выдает ошибку:
*** Term : operate
*** Type : [Char] -> [(Char,Int)]
*** Does not match : [(Char,Int)] -> String
Подсказка: src :: String
и fff :: String -> [(Char, Int)]
.
@JosephSible-ReinstateMonica Спасибо за ответ, но я не совсем понимаю, что и где менять. Я новичок в Haskell и не все понимаю. Можно поконкретнее, если не возражаете?
@FyodorSoikin Спасибо за ответ, но я не совсем понимаю, что и где менять. Я новичок в Haskell и не все понимаю. Можно поконкретнее, если не возражаете?
тип операции неверен, потому что у fff есть тип [Char] -> [(Char, Int)]
operate :: [(Char, Int)] -> String
operate = fff
вывод типа предполагает [Char] -> [(Char, Int)]
,
хороший
но тип возвращаемого значения по-прежнему должен быть [(String, Int)]
, если мы хотим передать вывод этой функции в formatOne
formatOne :: Show a => (String, a) -> String
formatOne (s, i) = s ++ " : " ++ show i
operate :: String -> [(String, Int)]
operate = map (\(x,y) -> (x:"", y)) . fff
-- (\(x,y) -> (x:"", y)) this lambda turns first element of tuple from Char to String
-- unlines joins elements of list into string while separating elements with \n
formatAll = unlines . map formatOne
main :: IO ()
main = do
src <- readFile "input.txt"
writeFile "output.txt" (formatAll (operate src))
Спасибо за ответ, но теперь я получаю другую ошибку из-за formatAll
ERROR "":24 - Unresolved top-level overloading *** Binding : formatAll *** Outstanding context : Show b
@ClarkBrown, хм, попробуй вставить вот так writeFile "output.txt" (unlines . map formatOne (operate src))
Пробовал, но та же ошибка((( Может ли это быть связано с тем, что у меня Haskell98?
Посмотрите, какой параметр вы передаете
operate
. Каков его тип? Что говорит подпись типаoperate
, что тип должен быть? Вот ваше несоответствие.