2016-06-13 15 views
0

私はハスケルを新しくし、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にパラメータがないため、エラーになります。

つのオプション:StringMaptype StringMap = [(String, String)]

  1. 変更、それはパラメータを必要としないので。
  2. StringMapに、stringMapReplaceの署名のパラメータを指定します。どのようなパラメータ、あなたは尋ねる?いずれも無視されるためです。たとえば、次のように動作するはずです:

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

を@chi感謝。今修正されました。 – crockeea

関連する問題