私が最初にソートされた順序で第二の前に現れなければならない場合、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 `<'
私が最初にソートされた順序で第二の前に現れなければならない場合、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 `<'
あなたが仕事に<
ための型制約を必要とする:
min :: Ord a => a -> a -> Bool
-- ^^^^^
なぜ型制約となるのかを教えておくと便利です。 – amindfv
@amindfv:dave4420はすでにこれを行いました。 –
あなた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 False
がblah
と同じで、サラのメモとして
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
の代わりに元の<
を使用するだけですか?
@ gonzoc0ding:Daveは完全に正しいです(途中で+1) –
「min a b = if a nimi
はすでにこれには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) =>
を書くことです。
fooの場合はTrue、それ以外の場合はFalseは常にfooとして書き直すことができます – Sarah
ありがとうございました! –
次回、疑問がある場合は、上部にタイプ注釈を残して、多くの場合コンパイラに尋ねることができます。したがって、:t minは、私がghciに問い合わせるとき、Ord制約に正しい型を与えます。 – Sarah