这是我正在使用的函数:
threeWordFunction :: [String] -> Map.Map String [String] -> String
threeWordFunction [x, y, z] orbitingData = do
Map.insert z [x, y] orbitingData
""
导致以下错误:
srcMyLib.hs:40:6: error:
* Couldn't match type `Map.Map String' with `[]'
Expected type: [[String]]
Actual type: Map.Map String [String]
* In a stmt of a 'do' block: Map.insert z [x, y] orbitingData
In the expression:
do Map.insert z [x, y] orbitingData
""
In an equation for `threeWordFunction':
threeWordFunction [x, y, z] orbitingData
= do Map.insert z [x, ....] orbitingData
""
|
40 | Map.insert z [x, y] orbitingData
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我尝试了一大堆修复程序,但没有发现任何可能导致此错误的原因。该函数只是试图将字符串添加到映射中,没有什么特别之处。如有任何帮助,我们将不胜感激。
问题
正如一些贡献者所说,do
就是问题所在。然而,让我试着分解你想要什么(正如我所看到的(和你做什么。
threeWordFunction :: [String] -> Map.Map String [String] -> String
声明函数的类型。这就是你计划做的。有了String
和Map
的列表,你想提供一个String
。如果我在Haskell中读到这篇文章,我会推断您可能想要使用Map
来提取一些有用的东西来构建String
。实际上,函数的唯一输出是String
。由于CCD_ 8不是输出;丢失";。
当我读到你想做什么时,你声称你想在Map
中插入一个值。所以我假设您想要输出您得到的Map
。在这里,我可以推断出你的第一个错误:你的想法有副作用。我想您想在函数内部修改Map
,并且您已经预料到Map将在函数外部进行修改。但这不是哈斯克尔的工作方式。这就是大多数具有命令式功能的语言的工作方式。
因此,要执行,您需要使用do
单词。这背后的思想状态是提供一个指令序列,就像在带有大括号的C块中一样。这是错误的。在Haskell中,do
单词是语法糖,它指出了你在monad。。。所以你的计算结果很可能是一个monad。但函数类型并不是这么说的。因此编译器会产生一个错误。
您可以做些什么来与您的类型保持一致
考虑到类型,迟将提供一个解决方案。
threeWordFunction [x, y, z] orbitingData = let newMap = Map.insert z [x, y] orbitingData in ""
编译器不会再抱怨了。您构建了一个新的MapnewMap
,它可以按照您想要的方式进行修改。并提供String
""
作为输出。但是,newMap
在您的功能之外永远无法访问。所以这个插件没用。
您可以做些什么来满足您的需求
更改类型。。。Haskell中的类型提供了一个规范,该规范清楚地定义了预期的有效解决方案(或多或少(。
因此,您可以想要明确提供Map的东西。
threeWordFunction :: [String] -> Map.Map String [String] -> Map.Map String [String]
或地图和字符串
threeWordFunction :: [String] -> Map.Map String [String] -> (Map.Map String [String], String)
你也可以像State一样使用monad,但这对你的水平来说可能太多了。
考虑到新类型,您现在可以返回所需的实体。
threeWordFunction :: [String] -> Map.Map String [String] -> (Map.Map String [String], String)
threeWordFunction [x, y, z] orbitingData =
let newMap = Map.insert z [x, y] orbitingData
in (newMap, "")
注意,如果你总是想提供一个""
作为字符串,这可能表明你不需要它
希望这能帮助你理解这个问题。