在 ghci 中定义排序函数有点尴尬。我认为最简单的方法是将排序函数写入文件中,然后将其加载到 ghci 中。例如,您可以在名为sort.hs(取自the HaskellWiki)的文件中编写这个简洁(虽然不是就地!)版本的快速排序:
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
并将其加载到 ghci 中:
> :l sort.hs
如果你真的想在 ghci 中定义函数,你可以这样做(来自the Haskell user's guide):
> :{
> let { quicksort [] = []
> ; quicksort (p:xs) = (quicksort (filter (< p) xs)) ++ [p] ++ (quicksort (filter (>= p) xs))
> }
> :}
一旦定义好了,你就可以做
> let combineAndSort xs ys = quicksort (xs ++ ys)
正如另一个答案已经解释的那样,从Data.List 导入排序当然会更快,但手动执行它绝对是一个很好的练习。
您的问题表明您对 Haskell 中变量的范围有些困惑。在这一行
> let combineList xs ys = xs++ys
您引入了变量xs 和ys。在等号左侧提到它们只是意味着combineList 有两个变量,在该函数的主体中,您将把这些变量称为xs 和ys。它没有在函数之外引入名称,所以下一行
> let zs = combineList xs ys
真的没有意义,因为名称xs 和ys 仅在combineList 范围内有效。要让zs 有值,你需要给combineList 一些具体的参数,例如:
> let zs = combineList [2,4,6] [1,3,5] --> [2,4,6,1,3,5]
但由于combineList 的主体是如此简单,实际上这样做会更容易:
> let zs = [2,4,6] ++ [1,3,5] --> [2,4,6,1,3,5]
最后一行是
> let sortList (z:zs) = if (head zs) < z then (zs:z) else (z:(sortList zs))
我认为这行让你很困惑,因为这里有很多不同的错误。 ДМИТРИЙ МАЛИКОВ 的回答提到了大部分,我鼓励您尝试理解他提到的每个错误。