0
我是新來的Haskell和我有JValue
一個問題,我以前把它定義爲:哈斯克爾 - 無法匹配,期望型「JValue」與實際型「[(字符串,JValue)」
data JValue =
JString String
| JNumber Double
| JBool Bool
| JNull
| JObject [(String, JValue)]
| JArray [JValue]
而且我想做一個功能
getPosition :: String -> JValue -> Int -> Int
getPosition _ (JObject []) _ = -1
getPosition word (JObject [(name,_)]) index
| stringsAreEqual word name = index
| otherwise = -1
getPosition word (x:xs) index = getPosition word xs (index+1)
是爲了找到一個元組的指數在JObject
具有相同的字符串作爲一個在參數中。我得到這個錯誤:
Couldn't match expected type ‘with actual type ‘[(String, JValue)]’
我在做什麼錯?我可能會讓自己變得太複雜。謝謝
除了你的問題,我會建議你使用'也許Int'結果類型,而不是使用魔法值' -1「表示」未找到「。同樣''JObject(Map String JValue')會是一個更好的選擇,你可以得到大量的Map函數!最後你的函數是部分的,你需要考慮'JObject'之外的'JValue',最簡單的解決方案是使用'getPosition _ x _ = error $「錯誤:getPosition中預期的JObject,但得到:」++ show x「,它仍然是部分函數,但錯誤信息更好 – epsilonhalbe
即使有效位置必須是一個正整數,最好是通過返回'Maybe Int'而不是'Int'來確定是否找到了字符串,在這種情況下,如果找不到字符串,則返回'Nothing',並且'只需x '如果它在'x'位置找到的話 – chepner
Btw。除非你爲了學習的目的這麼做,否則使用['aeson'](https://hackage.haskell.org/package/aeson)而不是編寫你自己的JSON -圖書館 – epsilonhalbe