2016-06-13 54 views
0

我是Haskell的新手,嘗試實現here中的代碼以使用地圖替換字符串。我彙編,說使用地圖編譯錯誤替換字符串

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

我試圖尋找過程中收到錯誤信息,但我可以找到錯誤的唯一的答案是,我不是澄清StringMap是什麼類型。不過,我認爲這是Show stringMap正在做的。

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 

注:strReplace來自Data.Strings

我不知道是否有別的錯誤的代碼,編譯器只給上面,現在的錯誤。如果您注意到其他任何事情,請隨時提及(或稍後作爲練習留待我調試)。

回答

4

您將類型同義詞StringMap定義爲採用(未使用的)類型參數stringMap。類型的同義詞,而不是newtype,data和GADT聲明,必須始終爲完全應用。因此,每次出現StringMap必須提供一個參數,如forall a . StringMap a,StringMap Int等。在stringMapReplace的簽名中,您不給StringMap一個參數,因此是錯誤。

兩個選項:

  1. 變化StringMaptype StringMap = [(String, String)],因爲它並不需要的參數。
  2. 給出StringMap參數stringMapReplace的簽名。你問什麼參數?任何一個,因爲它被忽略。例如,下面應該工作:

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

@chi感謝。現在修復。 – crockeea