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)
这是没有意义的,因为xs和ys是你的不明之外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并且尚未定义.你可以得到head的zs另一个模式匹配而已.也许你不想做的另一递归调用then的部分if发言.最后我应该承认这种排序算法根本不起作用.
在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)
您介绍变量xs和ys。在等号的左侧提及它们只是意味着combineList需要两个变量,在该函数的主体中,您将把这些变量称为xs和ys。它没有在函数之外引入名称,所以下一行
> let zs = combineList xs ys
Run Code Online (Sandbox Code Playgroud)
并没有真正的意义,因为名称xs和ys仅在的范围内有效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)
我认为这条线让您很困惑,因为这里有很多不同的错误。答案由??????? ??????? 提到大多数,我鼓励您尝试理解他提到的每个错误。
| 归档时间: |
|
| 查看次数: |
25850 次 |
| 最近记录: |