2015-12-01 159 views
0

我正在递归的Haskell中创建合并排序函数。有人告诉我,我的评估的一部分,我必须定义类型为:Haskell - Ord类型是什么意思?

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

我假定该函数需要一个数组作为输入和输出数组。我知道ord是一类。

在上述背景下Ord a是什么意思?

这是我的函数:

isort :: Ord a => [a] -> [a] 
isort [x] = [x] 
isort (x:xs) = insert x (isort xs) 
    where 
     insert :: Int -> [Int] -> [Int] 
     insert a [] = [] 
     insert a (b:c) | a < b  = a:b:c 
         | otherwise = b : insert a c 

当我尝试加载我的函数文件到ghci中我得到的错误:

Couldn't match type ‘a’ with ‘Int’ 
    ‘a’ is a rigid type variable bound by 
     the type signature for isort :: Ord a => [a] -> [a] 
     at LabSheet2.hs:17:10 
Expected type: [a] 
Actual type: [Int] 
... 
+0

尝试在最后三行上重命名'a'? – Jacob

+1

这里没有阵列。 '[a]'是一个* list *类型。 – dfeuer

回答

6

Ord a是一个类型类的约束,表示你的函数适用于任何类型a,只要a是可比的(Ord erable)。您收到的错误消息是由于您的外部声明(表示其适用于任何Ord a => a)和内部insert(仅“适用于Int”)之间的冲突。

+0

什么是内部声明的解决方案? – nonsequiter

+0

@nonsequiter我希望你可以删除'insert'类型声明并且推断它。如果你想明确地指定它,你需要保持一致。 'isort'被声明为*任何/每个*'a'的工作是可比的,但是'insert'被声明为仅适用于'Int',这是一种特定的可比类型。 'Ord a => a - > [a] - > [a]'可以工作。 – ryachza

+0

@nonsequiter此外,它看起来有一个bug,因为'insert'的基本情况下'a'(变量,而不是类型)被忽略,应该可能是'a:[]'。 – ryachza