2012-04-11 15 views
4

私が最初にソートされた順序で第二の前に現れなければならない場合、Trueを返します& 2つのパラメータを受け入れ、単純な分の機能を実装しようとしています、:ハスケルとオード

min :: a -> a -> Bool 
min a b = if a < b then True else False 

私が取得:

No instance for (Ord a) 
arising from a use of `<' 
+11

fooの場合はTrue、それ以外の場合はFalseは常にfooとして書き直すことができます – Sarah

+0

ありがとうございました! –

+2

次回、疑問がある場合は、上部にタイプ注釈を残して、多くの場合コンパイラに尋ねることができます。したがって、:t minは、私がghciに問い合わせるとき、Ord制約に正しい型を与えます。 – Sarah

答えて

7

あなたが仕事に<ための型制約を必要とする:

min :: Ord a => a -> a -> Bool 
--  ^^^^^ 
+0

なぜ型制約となるのかを教えておくと便利です。 – amindfv

+0

@amindfv:dave4420はすでにこれを行いました。 –

25

あなたlook at the documentation場合は、

(<) :: a -> a -> Bool 

これは誤解を招くよう(<)ための型が与えられていることがわかります!

型宣言は、型クラスの定義に表示されます。

class Eq a => Ord a where ... 

だから、フルタイプは

ちなみに
(<) :: Ord a => a -> a -> Bool 

であるあなたが(<)のタイプが何であるかをGHCiの言わせれば、それは右のそれを取得します。

Prelude> :t (<) 
(<) :: (Ord a) => a -> a -> Bool 

min呼び出された関数が同じ型クラスでは、既に存在であることに注意します。あなたは、元のminを非表示にしない限り

min :: Ord a => a -> a -> a 

だからあなたはあなたの関数minを呼び出すことはできません。 (私はどのようにお見せするつもりはありません。代わりに、あなたの関数に別の名前を使用してください。)


最後に、あなたが今if blah then True else Falseblahと同じで、サラのメモとして

min :: Ord a => a -> a -> Bool 
min a b = if a < b then True else False 

を持っていますあなたは明確

min :: Ord a => a -> a -> Bool 
min a b = a < b 

に簡略化することができますので、今、Haskellの演算子が面白い名前を持つ関数だけです---これは

と同じです
min :: Ord a => a -> a -> Bool 
min a b = (<) a b 

私たちは、これをさらに簡素化することができます。

min :: Ord a => a -> a -> Bool 
min = (<) 

だからあなたmin(<)のためのちょうど別の名前です。 minの代わりに元の<を使用するだけですか?

+0

@ gonzoc0ding:Daveは完全に正しいです(途中で+1) –

+2

「min a b = if a nimi

8

はすでにこれには2つの答えがありますが、私は重要なポイントの欠落があると思う:

あなたの型シグネチャに(Ord a) =>が必要理由はあなたに」許可されているタイプを制約する必要があるということです"あなたの機能。

私は機能function :: a -> aを定義

は、私は私の関数が あらゆるのタイプのデータを取り、同じ型の値を返すことを言っています。

head :: [a] -> a - のいずれかのタイプを指定した場合、タイプのheadはリストの最初の引数を返します。これは、ヘッドが実際にデータ自体に「触れない」ため、それが何であるかは問題ではないからです。

しかし、あなたの状況はそのようではありません。私たちは、データ型の国を持っていると想像:

data Countries = USA | Nigeria | China | Canada -- yes, I know there are a few missing 

それはmin USA CanadaまたはUSA < Canadaを言っても意味がありません。

したがって、この方法で比較できる型に関数を制限する必要があります。Ordのインスタンス(型付けされた意味)を持つ型がtypeclassです。あなたがそれらを制限する方法は、あなたのタイプ署名の前に(Ord a) =>を書くことです。