使用映射编译错误替换字符串

时间:2016-06-13 12:02:37

标签: string haskell dictionary replace

我是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

我不知道代码是否还有其他问题,因为编译器现在只给出上面的错误。如果您注意到其他任何事情,请随时提及(或留待我稍后作为练习进行调试)。

1 个答案:

答案 0 :(得分:4)

您定义了类型同义词StringMap以获取(未使用的)类型参数stringMap。键入同义词,而不是newtypedata和GADT声明,必须始终完全应用。因此,StringMap的每次出现都必须提供参数,例如forall a . StringMap aStringMap Int等。在stringMapReplace的签名中,您不会StringMap参数,因此错误。

两个选项:

  1. StringMap更改为type StringMap = [(String, String)],因为它不需要参数。
  2. StringMap的签名中为stringMapReplace提供一个参数。你问什么参数?任何一个,因为它被忽略了。例如,以下内容应该有效:

    stringMapReplace :: StringMap String -> String -> String