在 ghci 中定义排序函数有点尴尬。我认为最简单的方法是将排序函数写入文件中,然后将其加载到 ghci 中。sort.hs
例如,您可以在一个名为(取自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 中定义函数,你可以这样做(来自Haskell 用户指南):
> :{
> let { quicksort [] = []
> ; quicksort (p:xs) = (quicksort (filter (< p) xs)) ++ [p] ++ (quicksort (filter (>= p) xs))
> }
> :}
一旦定义,你可以做
> let combineAndSort xs ys = quicksort (xs ++ ys)
正如另一个答案已经解释的那样,只导入 sort from 当然会更快 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]
但是由于 bodycombineList
非常简单,实际上这样做会更容易:
> 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))
我认为这条线让你很困惑,因为这里有很多不同的错误。ДМИТРИЙ МАЛИКОВ 的回答提到了大多数,我鼓励您尝试理解他提到的每个错误。