我是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
我不知道代码是否还有其他问题,因为编译器现在只给出上面的错误。如果您注意到其他任何事情,请随时提及(或留待我稍后作为练习进行调试)。
答案 0 :(得分:4)
您定义了类型同义词StringMap
以获取(未使用的)类型参数stringMap
。键入同义词,而不是newtype
,data
和GADT声明,必须始终完全应用。因此,StringMap
的每次出现都必须提供参数,例如forall a . StringMap a
,StringMap Int
等。在stringMapReplace
的签名中,您不会StringMap
参数,因此错误。
两个选项:
StringMap
更改为type StringMap = [(String, String)]
,因为它不需要参数。在StringMap
的签名中为stringMapReplace
提供一个参数。你问什么参数?任何一个,因为它被忽略了。例如,以下内容应该有效:
stringMapReplace :: StringMap String -> String -> String