這是我正在使用的功能:
threeWordFunction :: [String] -> Map.Map String [String] -> String
threeWordFunction [x, y, z] orbitingData = do
Map.insert z [x, y] orbitingData
""
導致以下錯誤:
src\MyLib.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
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我已經嘗試了一大堆修復,但沒有發現任何可能導致此錯誤的東西。該函式只是試圖將字串添加到地圖中,沒什么特別的。任何幫助,將不勝感激。
uj5u.com熱心網友回復:
問題
正如一些貢獻者所說,這do就是問題所在。但是,讓我嘗試分解您想要的(如我所見)和您所做的。
threeWordFunction :: [String] -> Map.Map String [String] -> String
宣告函式的型別。這是你打算做的。有一個串列String和一個Map你想提供一個String. 如果我在 Haskell 中讀到這篇文章,我會推斷您可能想使用Map來提取有用的東西來構建一個String. 實際上,您的函式的唯一輸出是 a String。由于Map不是輸出,因此任何修改都將“丟失”。
當我讀到你想做什么時,你聲稱你想在Map. 所以我想你想輸出你的結果Map。在這里我可以推斷出你的第一個錯誤:你認為有副作用。我想您想修改Map函式內部,并且您希望 Map 將在函式外部進行修改。但這不是 Haskell 的作業方式。這就是大多數具有命令式特性的語言的作業方式。
所以要做到這一點,你要使用一個do詞。這背后的想法是提供一個指令序列,就像在帶有花括號的 C 塊中一樣。這是錯誤的。在 Haskell 中,這個do詞是語法糖,并指出你在一個 monad 中……所以你的計算結果可能是一個 monad。但這不是函式型別所說的。所以編譯器會產生錯誤。
你可以做些什么來與你的型別保持一致
考慮到型別,解決方案將是 Chi 提供的解決方案。
threeWordFunction [x, y, z] orbitingData = let newMap = Map.insert z [x, y] orbitingData in ""
編譯器不會再抱怨了。您構建了一個新的地圖newMap,它可以按照您想要的方式進行修改。你提供String ""作為輸出。但是,newMap在您的功能之外將永遠無法訪問。所以插入是沒有用的。
你能做些什么來滿足你的需要
更改型別... Haskell 中的型別提供了一個規范,清楚地定義了預期的有效解決方案(或多或少)。
所以你可以想要一些明確提供地圖的東西。
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, "")
注意,如果您總是想將 a""作為字串提供,這可能表明您不需要它。
希望這可以幫助您理解問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462844.html
