リストなどの署名タイプを入力します
-
28-10-2019 - |
質問
平易な英語で次のタイプの署名をどのように定義しますか:
Ord a => ...
Eq a => ...
Num a => ...
これらの意味を説明して、違いが何であるかを教えていただけますか(他の誰かにそれをどのように説明するかという点で)?
ありがとう。
解決
これらはすべて「クラスの制約」の例です。それらに続くタイプ変数の代わりに使用できるタイプを制約します(a
この場合)、それが特定のものに属することを要求する タイプクラス. Ord
, Eq
と Num
タイプクラスの例です。
Ord a => ...
意味a
それに関連する秩序の自然な概念を持つタイプです。たとえば、整数は自然に小さいものから大きくなることができます。数学的な用語では、aが存在します 合計注文 の上a
. 。明らかな例この制約を必要とする関数はsort :: Ord a => [a] -> [a]
;この署名を読んでくださいsort
互いに比較して順番に置くことができるもののリストでのみ動作します。Eq a => ...
意味a
平等の概念のために、メンバーを互いに比較できるタイプです。数学的には、存在します 同等の関係 の上a
. 。これはスーパークラスであることに注意してくださいOrd
, 、秩序化の概念を持つものはすべて、同等性の概念を持たなければなりません。この制約を必要とする関数の例はelem :: Eq a => a -> [a] -> Bool
(リストに特定の要素が含まれているかどうかを決定します);この署名を読んでくださいelem
平等のために互いに比較できるもののリストでのみ動作します。あなたがどのように書くかについて考えるならelem
あなた自身、それは理にかなっているはずです。Num a => ...
意味a
数値タイプです。つまり、基本的な算術操作をサポートしています。+
,*
,-
,abs
. 。これは数学的な概念にほぼ似ていると思います 指輪. 。基本的に、あなたが「数字タイプ」と考えるすべてのタイプはこのクラスに属します:Int
,Double
, 、などNum a =>
関数があらゆる種類の数字で一般的に動作するように書かれている場合、署名の前の制約。例えば、sum :: Num a => [a] -> a
, 、数字のリストのすべての要素を要約すると、同様にうまく機能することができます[Int]
,[Double]
,[Rational]
, 、など...それがしなければならないのは、どんな種類の数字であっても、その内容を合計することだけです。しかし、彼らはそうでなければなりません!
基本的に、これらのタイプのクラス/制約は、関数の「原則的な過負荷」へのアプローチです。使用できます (==) :: Eq a => a -> a -> Bool
さまざまなタイプで、しかし どんなタイプでもありません. 。いくつかのこと、たとえば機能など、平等と比較することは意味がありません(おそらく、平等はそのタイプでは決定できないためです)、そしてそれは 一度もない 2つのことを比較するのは理にかなっています 違う 平等のタイプ(これをJavaとは対照的に、等式のためにおそらく異なるタイプの2つのオブジェクトを比較できます)。
タイプのクラスと制約についてさらに(非常にアクセスしやすい)読書には、強くお勧めします Haskellを学びます.