2016-04-30 30 views
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)]’ 

我在做什麼錯?我可能會讓自己變得太複雜。謝謝

+0

除了你的問題,我會建議你使用'也許Int'結果類型,而不是使用魔法值' -1「表示」未找到「。同樣''JObject(Map String JValue')會是一個更好的選擇,你可以得到大量的Map函數!最後你的函數是部分的,你需要考慮'JObject'之外的'JValue',最簡單的解決方案是使用'getPosition _ x _ = error $「錯誤:getPosition中預期的JObject,但得到:」++ show x「,它仍然是部分函數,​​但錯誤信息更好 – epsilonhalbe

+0

即使有效位置必須是一個正整數,最好是通過返回'Maybe Int'而不是'Int'來確定是否找到了字符串,在這種情況下,如果找不到字符串,則返回'Nothing',並且'只需x '如果它在'x'位置找到的話 – chepner

+0

Btw。除非你爲了學習的目的這麼做,否則使用['aeson'](https://hackage.haskell.org/package/aeson)而不是編寫你自己的JSON -圖書館 – epsilonhalbe

回答

3

在最後一個子句的第二個參數中,您對列表(x:xs)進行了模式匹配,但必須有JValue

當你想找到一個列表中的索引,使用findIndexData.List

getPosition word (JObject tuples) = 
     findIndex (\(name,_) -> name == word) tuples 
相關問題