And*_* S. 1 mergesort haskell scope pattern-matching
我试图做一个简单的合并排序功能.几乎完成了代码,但是:
m_sort :: (Ord a) => [a] -> [a]
m_sort d
| d == [] = []
| d == [a] = [a]
| otherwise = merge (m_sort (fst $ split d)) (m_sort (snd $ split d))
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我得到了Haskell_training.hs:137:21: error: Variable not in scope: a.排除| d == [a] = [a]导致好的编译,但没有它就无法工作.我没有看到模式匹配有一些非常明显的问题吗?
我没有看到模式匹配有一些非常明显的问题吗?
是的,当然:你没有写过模式匹配!(好吧,你写了一个简单的d,它匹配任何东西并命名它d.)你写的是一个守卫,它必须是一个类型的表达Bool.虽然d == [a]在语法上是可以的,并且可能有类型Boolif d和a具有适当的类型,但它在这里不起作用,因为你没有任何a可比较d的.
你可能想要这个:
m_sort [] = []
m_sort [a] = [a]
m_sort d = merge ...
Run Code Online (Sandbox Code Playgroud)
现在,不是让一个表达式[a]在其中引用a一个名为变量的变量,这将是一个模式匹配,它寻找一个单元素列表形状的术语并绑定a到该元素.