Parsing 防护上的分析错误
我正在实现merge sort的merge子例程。我在编译时收到以下错误消息:输入解析错误|Parsing 防护上的分析错误,parsing,sorting,haskell,merge,Parsing,Sorting,Haskell,Merge,我正在实现merge sort的merge子例程。我在编译时收到以下错误消息:输入解析错误| merge :: [Int] -> [Int] -> [Int] merge xs ys = go xs ys [] where go xs ys zs = |null ys = zs ++ xs |null xs = zs ++ ys
merge :: [Int] -> [Int] -> [Int]
merge xs ys = go xs ys []
where go xs ys zs =
|null ys = zs ++ xs
|null xs = zs ++ ys
|(head xs) <= head ys = go (tail xs) ys (head xs : zs)
|otherwise = go xs (tail ys) (head ys : zs)
merge::[Int]->[Int]->[Int]
合并xs ys=go xs ys[]
xs ys zs去哪里=
|空ys=zs++xs
|空xs=zs++ys
|(head xs)您可以通过删除go xs ys zs
之后的=
来修复语法错误-当定义带有保护的内容时,=
只出现在每个保护之后,就像您已经有的那样
除此之外,如果您更多地使用模式匹配,您的代码将更干净。您可以使用模式[]
来识别空列表和(x:xs)
来识别非空列表,并将头和尾绑定到名称x
和xs
,等等,而不是先检查列表是否为null
,然后再检查头和尾
merge :: [Int] -> [Int] -> [Int]
merge xs ys = go xs ys []
where go xs [] zs = zs ++ xs
go [] ys zs = zs ++ ys
go (x:xs) (y:ys) zs
| x <= y = go xs (y:ys) (x:zs)
| otherwise = go (x:xs) ys (y:zs)
merge::[Int]->[Int]->[Int]
合并xs ys=go xs ys[]
其中go xs[]zs=zs++xs
go[]ys zs=zs++ys
go(x:xs)(y:ys)zs
|x您在go xs ys zs
之后有一个额外的=
——当定义带有防护装置的内容时,=
只在每个防护装置之后出现,就像您已经有的那样。