在Haskell中实现插入排序功能时遇到一些麻烦

时间:2015-04-26 12:07:33

标签: sorting haskell insertion-sort

我是Haskell语言的初级,我试图在ghci环境中的Haskell中实现插入排序功能。

这是我的代码。

prelude> let insert x [] = x:[]

insert :: t1 -> [t] -> [t1]

prelude> let insert x (y:ys) = 
if x < y then x:y:ys else y : insert ys


insert :: Ord a => a -> [a] -> [a]

我试过

insert 1 []

结果是[1],效果很好。

我试过

insert 1 ([2,3]) 

结果是[1,2,3],仍然运作良好。

(实际上,我不知道为什么我要解析第二个参数列表。  但如果我尝试插入1 [2,3],它就不起作用。)

直到这一点,它运作良好。但是当我尝试

insert 4 ([1,2,3]) 

就是这样。

[1,2,3*** Exception: <interactive>:165:5-61: Non-exhaustive patterns in function 

我不知道为什么会这样发生。请帮助我。

1 个答案:

答案 0 :(得分:2)

你用另一个函数覆盖了你的第一个函数let insert x [] = x:[](在你的下一个let insert ...中 - 这是因为你在GHCi中使用let ...

相反,您应该创建 .hs 文件并将其加载到 GHCi 中。

然后启动您喜欢的编辑器并插入:

module MyInsertSort where

insert :: Ord a => a -> [a] -> [a]
insert x []     = x:[]
insert x (y:ys) = if x < y then x:y:ys else y : insert x ys

保存(我做MyInsert.hs),启动ghci并将其加载到其中:

λ> :l MyInsert.hs
[1 of 1] Compiling MyInsertSort     ( MyInsert.hs, interpreted )
Ok, modules loaded: MyInsertSort.
λ> insert 4 ([1,2,3])
[1,2,3,4]

λ> insert 1 ([2,3])
[1,2,3]

现在应该有效:D

备注

您的第二行insert ys而不是insert x ys

出现了一个小错误