2016-06-13 4 views
0

Ich bin neu in Haskell, und versuchen, den Code von here zu implementieren, um Zeichenfolgen mit einer Karte zu ersetzen. Ich erhalte während der Kompilierung eine Fehlermeldung,String ersetzen mit Karte Kompilierung Fehler

* Expecting one more argument to `StringMap' 
    Expected a type, but `StringMap' has kind `* -> *' 
* In the type signature: 
    stringMapReplace :: (Show stringMap) => StringMap -> String -> String 

sagt, ich gesucht habe versucht, aber die einzige Antwort, die ich für den Fehler finden kann, ist, dass ich nicht bin zu klären, welche Art StringMap ist. Ich dachte jedoch, das ist was Show stringMap tat.

import Data.Map 
import Data.Strings 

type StringMap stringMap = [(String, String)] 
myStringMap = 
    [ 
     ("org1", "rep1"), 
     ("org2", "rep2") 
    ] 

stringMapReplace :: (Show stringMap) => StringMap -> String -> String 
stringMapReplace [] s = s 
stringMapReplace (m:ms) s = strReplace ms (replace (fst m) (snd m) s) 

main :: IO() 
main = do 
    putStrLn "Enter some text:" 
    putStrLn =<< stringMapReplace myStringMap <$> toUpper getLine 

Hinweis: strReplace kommt von Data.Strings

Ich weiß nicht, ob es noch etwas falsch mit dem Code ist, wie die Compiler nur oben jetzt den Fehler geben. Wenn Sie noch etwas anderes bemerken, können Sie es gerne erwähnen (oder lassen Sie es mich später als Übung debuggen).

Antwort

4

Sie haben den Typensynonym StringMap definiert, um einen (nicht verwendeten) Typparameter stringMap zu übernehmen. Typ Synonyme, im Gegensatz zu newtype, data und GADT-Deklarationen, muss immer vollständig angewendet werden. Daher muss bei jedem Auftreten von StringMap ein Parameter wie forall a . StringMap a, StringMap Int usw. angegeben werden. In der Signatur stringMapReplace geben Sie keinen StringMap Parameter an, daher der Fehler.

zwei Optionen:

  1. ändern StringMap zu type StringMap = [(String, String)], weil es keinen Parameter benötigen.
  2. Geben Sie StringMap einen Parameter in der Signatur von stringMapReplace. Welchen Parameter fragen Sie? Irgendein, weil es ignoriert wird. Zum Beispiel sollten folgende Arbeiten:

    stringMapReplace :: StringMap String -> String -> String 
    
+0

@chi Dank. Jetzt behoben. – crockeea