如何在命令行ghci中对Haskell中的列表进行排序

Ice*_*ele 5 sorting haskell list

我是Haskell的新手,我想创建一个将两个列表合并在一起的函数,然后将组合列表从最小到最大排序.这应该在命令行中完成而不使用模块.

这是我目前所拥有的,我无法使"sortList"功能工作,我也不知道如何将这3行合并为1个函数.

let combineList xs ys = xs++ys
let zs = combineList xs ys
let sortList (z:zs) = if (head zs) < z then (zs:z) else (z:(sortList zs))
Run Code Online (Sandbox Code Playgroud)

ДМИ*_*КОВ 20

如何排序列表ghci:

Prelude> :m + Data.List
Prelude Data.List> sort [1,4,2,0]
[0,1,2,4]
Run Code Online (Sandbox Code Playgroud)

关于你的功能

let combineList xs ys = xs++ys
Run Code Online (Sandbox Code Playgroud)

为append函数创建另一个别名有什么意义?但如果你真的想要一个 - 它可以定义为let combineList = (++).

let zs = combineList xs ys
Run Code Online (Sandbox Code Playgroud)

这是没有意义的,因为xsys是你的不明之外combineList.

let sortList (z:zs) = if (head zs) < z then (zs:z) else (z:(sort zs))
Run Code Online (Sandbox Code Playgroud)

此定义无效,因为它不会覆盖和清空列表大小写并(zs:z)生成无限类型,sort并且尚未定义.你可以得到headzs另一个模式匹配而已.也许你不想做的另一递归调用then的部分if发言.最后我应该承认这种排序算法根本不起作用.


Bor*_*ris 5

在ghci中定义排序功能有点尴尬。我认为最简单的方法是将排序功能写入文件,然后将其加载到ghci中。例如,您可以在一个名为sort.hs(摘自HaskellWiki)的文件中编写这个简洁(虽然不是就地!)版本的quicksort

quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs
Run Code Online (Sandbox Code Playgroud)

并将其加载到ghci中:

> :l sort.hs 
Run Code Online (Sandbox Code Playgroud)

如果您确实想在ghci中定义函数,则可以执行以下操作(来自Haskell用户指南):

> :{
> let { quicksort [] = []
>     ; quicksort (p:xs) = (quicksort (filter (< p) xs)) ++ [p] ++ (quicksort (filter (>= p) xs))
>     }
> :}
Run Code Online (Sandbox Code Playgroud)

一旦定义好,就可以

> let combineAndSort xs ys = quicksort (xs ++ ys)
Run Code Online (Sandbox Code Playgroud)

正如已经回答的另一个答案,从中导入sort当然会更快 Data.List,但是手动进行绝对是一个不错的练习。

您的问题表明您对Haskell变量的范围有些困惑。在这条线

> let combineList xs ys = xs++ys
Run Code Online (Sandbox Code Playgroud)

您介绍变量xsys。在等号的左侧提及它们只是意味着combineList需要两个变量,在该函数的主体中,您将把这些变量称为xsys。它没有在函数之外引入名称,所以下一行

> let zs = combineList xs ys
Run Code Online (Sandbox Code Playgroud)

并没有真正的意义,因为名称xsys仅在的范围内有效combineList。为了获得zs价值,您需要给出combineList一些具体的参数,例如:

> let zs = combineList [2,4,6] [1,3,5]  --> [2,4,6,1,3,5]
Run Code Online (Sandbox Code Playgroud)

但是由于的主体combineList是如此简单,因此实际上这样做会更容易:

> let zs = [2,4,6] ++ [1,3,5] --> [2,4,6,1,3,5]
Run Code Online (Sandbox Code Playgroud)

最后一行是

> let sortList (z:zs) = if (head zs) < z then (zs:z) else (z:(sortList zs))
Run Code Online (Sandbox Code Playgroud)

我认为这条线让您很困惑,因为这里有很多不同的错误。答案由??????? ??????? 提到大多数,我鼓励您尝试理解他提到的每个错误。