1. ホーム
  2. haskell

[解決済み] Haskell - Ord aの型は何を意味するのでしょうか?

2022-02-05 13:53:12

質問

Haskellで再帰的なマージソート関数を作っています。私は評価の一部として、私は次のように型を定義しなければならないと言われました。

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]
...

解決方法は?

その Ord a は型クラス制約で、関数が任意の型に対して動作することを示します。 a である限り a は比較可能である ( Ord を消去することができます)。エラーメッセージが表示されるのは、外側の宣言が Ord a => a と、内側の insert に対してのみ機能すること。 Int 's.