Haskell: Parse error in pattern

五迷三道 提交于 2019-11-26 04:55:21

问题


Who likes to tell me what is wrong with this code (syntactically)?

-- merge two sorted lists
mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX a:as b:bs res
    | a > b     = mergeX as b:bs a:res
    | otherwise = mergeX a:as bs b:res

Interpreter:

Parse error in pattern: mergeX


回答1:


You need some parenthesis:

mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX (a:as) (b:bs) res
    | a > b     = mergeX as (b:bs) (a:res)
    | otherwise = mergeX (a:as) bs (b:res)

The reason is because : has a lower precedence than function application, so mergeX a:as b:bs res will be parsed as:

(mergeX a):(as b):(bs res)

which is an error.




回答2:


You need to put constructor patterns (or however they are called) in parantheses.

mergeX (a:as) (b:bs) res 


来源:https://stackoverflow.com/questions/8561762/haskell-parse-error-in-pattern

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!