возможно ли в haskell "вызывать функции в структуре данных"? - PullRequest
1 голос
/ 03 апреля 2012

У меня есть некоторые функции (charfreq, wordfreq, charcount, wordcount, parerror), и я хочу использовать его в dataStructure с заданной строкой. Но как я могу это сделать? Я пытаюсь этим и многими способами, но у меня все ошибки. Заранее спасибо.

data StrStat = StrStat  { charfreq :: [( Char , Int )] 
                        , wordfreq :: [([ Char ] , Int )] 
                        , charcount :: Int 
                        , wordcount :: Int 
                        , parerror::Maybe Int 
                        }


analyze :: [Char] -> StrStat
analyze x = StrStat { charfreq = (charfreq x) {-this line gives error-}
                    , wordfreq = (wordfreq x)
                    , charcount = (charcount x)
                    , wordcount = (wordcount x)
                    , parerror = (parerror x) 
                    }

Сообщение об ошибке: Syntax error in input (unexpected `=')

analyze :: [Char] -> StrStat
analyze x = StrStat { "charfreq" = (charfreq x)
                    , "wordfreq" = (wordfreq x)
                    , "charcount" = (charcount x)
                    , "wordcount" = (wordcount x)
                    , "parerror" = (parerror x) 
                    }

когда я попробовал предыдущий, я получил ту же ошибку в той же строке

1 Ответ

5 голосов
/ 03 апреля 2012

Ошибка, которую я получаю для вашей первой версии:

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
                    }

~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...