Ошибка, которую я получаю для вашей первой версии:
Couldn't match expected type `StrStat' with actual type `[Char]'
In the first argument of `charfreq', namely `x'
In the `charfreq' field of a record
In the expression:
StrStat
{charfreq = (charfreq x), wordfreq = (wordfreq x),
charcount = (charcount x), wordcount = (wordcount x),
parerror = (parerror x)}
Это имеет смысл для меня, поскольку вы применяете свои методы получения (все они определены в вашей декларации data StrStat
, например, charfreq :: StrStat -> [( Char , Int )]
) вызываются для данных типа [Char]
, а не для значения StrStat
.
charfreq =
, и это аргументы на основе ключевых слов для установки различных полей StrStat
, иМне нужно дать соответствующее значение (например, [(Char, Int)]
) на их RHS.
Я предполагаю, что вы пытаетесь сделать, это построить значение StrStat
, которое вы могли бы сделать, создав соответствующиезначения:
import Control.Arrow
import Data.List
data StrStat = StrStat { charfreq :: [( Char , Int )]
, wordfreq :: [([ Char ] , Int )]
, charcount :: Int
, wordcount :: Int
, parerror::Maybe Int
}
freq :: Ord a => [a] -> [(a, Int)]
freq = map (head &&& length) . group . sort
analyze :: [Char] -> StrStat
analyze x = StrStat { charfreq = freq x
, wordfreq = freq $ words x
, charcount = length x
, wordcount = length $ words x
, parerror = Nothing
}
~