Map.insert在Haskell中无故提示错误



这是我正在使用的函数:

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

声明函数的类型。这就是你计划做的。有了StringMap的列表,你想提供一个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, "") 

注意,如果你总是想提供一个""作为字符串,这可能表明你不需要它

希望这能帮助你理解这个问题。

相关内容

  • 没有找到相关文章

最新更新