2012-04-02 9 views
1

Ich habe einige Funktionen (charfreq, wordfreq, charcount, wordcount, parerror) und ich möchte es in DataStructure mit der angegebenen Zeichenfolge verwenden.Aber wie kann ich es tun? Ich versuche auf diese und viele Weise, aber ich habe alle Fehler. Vielen Dank im Voraus.ist "Aufruf von Funktionen in Datenstruktur" in Haskell möglich?

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) 
        } 

Fehlermeldung lautet: 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) 
        } 

wenn ich vorherige versuchte, bekam ich den gleichen Fehler auf der gleichen Linie

Antwort

5

Der Fehler, den ich für die erste Version zu erhalten ist

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)} 

Das macht für mich Sinn, wie Sie Ihre Getters anwenden (alles in IhrerdefiniertDeklaration, zum Beispiel, charfreq :: StrStat -> [(Char , Int)]) werden Daten vom Typ [Char] anstatt über einen StrStat Wert aufgerufen.

Die charfreq = und solche sind stichwortbasierte Argumente für die verschiedenen Felder der StrStat einstellen und braucht den entsprechenden Wert gegeben werden (z.B. [(Char, Int)]) auf ihrer RHS.

Was ich vermute, Sie versuchen zu tun, einen StrStat Wert zu konstruieren, die Sie durch den Bau von entsprechenden Werte tun könnte:

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 
        } 

~

+1

Die OP stellt fest, dass er Funktionen wie 'charfreq' bereits definiert, so macht der Code für mich Sinn. Aber wenn ich das versuche, ist der Fehler, den ich bekomme, "Mehrere Deklarationen von' charfreq '". Beachten Sie, dass der Fehler, den Sie erhalten haben, nicht mit dem in der Frage übereinstimmt. – svick

+0

@svick: guter Punkt. Ich weiß nicht, wie ich den OP-Fehler neu erstellen soll. – rampion

+2

@svick: Wenn 'charfreq' von einem anderen Modul importiert wurde, erhalten Sie erst einen Fehler, wenn Sie versuchen, es zu verwenden. – hammar

Verwandte Themen