变量不在范围内:a

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]导致好的编译,但没有它就无法工作.我没有看到模式匹配有一些非常明显的问题吗?

Dan*_*ner 8

我没有看到模式匹配有一些非常明显的问题吗?

是的,当然:你没有写过模式匹配!(好吧,你写了一个简单的d,它匹配任何东西并命名它d.)你写的是一个守卫,它必须是一个类型的表达Bool.虽然d == [a]在语法上是可以的,并且可能有类型Boolif da具有适当的类型,但它在这里不起作用,因为你没有任何a可比较d的.

你可能想要这个:

m_sort [] = []
m_sort [a] = [a]
m_sort d = merge ...
Run Code Online (Sandbox Code Playgroud)

现在,不是让一个表达式[a]在其中引用a一个名为变量的变量,这将是一个模式匹配,它寻找一个单元素列表形状的术语并绑定a到该元素.