Haskell-型と型クラス

Haskellは関数型言語であり、厳密に型指定されています。つまり、アプリケーション全体で使用されるデータ型は、コンパイル時にコンパイラーに認識されます。

組み込み型クラス

Haskellでは、すべてのステートメントは数式と見なされ、この式のカテゴリはと呼ばれます。 Type。「Type」は、コンパイル時に使用される式のデータ型と言えます。

詳細については、 Type、「:t」コマンドを使用します。一般的な方法で、Type 値と見なすことができますが、 Type Class同様の種類のタイプのセットと見なすことができます。この章では、さまざまな組み込みタイプについて学習します。

Int

Int整数型データを表す型クラスです。2147483647から-2147483647の範囲内のすべての整数は、Int型クラス。次の例では、関数fType() 定義されたタイプに従って動作します。

fType :: Int -> Int -> Int 
fType x y = x*x + y*y
main = print (fType 2 4)

ここでは、関数のタイプを設定しました fType() なので int。関数は2つかかりますint 値と1を返します int値。このコードをコンパイルして実行すると、次の出力が生成されます-

sh-4.3$ ghc -O2 --make *.hs -o main -threaded -rtsopts 
sh-4.3$ main
20

整数

Integer のスーパーセットと見なすことができます Int。この値は数値に制限されないため、整数は制限なしに任意の長さにすることができます。の基本的な違いを確認するにはInt そして Integer タイプの場合、上記のコードを次のように変更しましょう-

fType :: Int -> Int -> Int 
fType x y = x*x + y*y 
main = print (fType 212124454 44545454454554545445454544545)

上記のコードをコンパイルすると、次のエラーメッセージがスローされます-

main.hs:3:31: Warning:            
   Literal 44545454454554545445454544545 is out of the Int range -
   9223372036854775808..9223372036854775807 
Linking main ...

このエラーは、関数fType()が1つのInt型値を予期しており、実際の大きなInt型値を渡しているために発生しました。このエラーを回避するために、タイプ「Int」を「Integer」に変更して、違いを観察してみましょう。

fType :: Integer -> Integer -> Integer 
fType x y = x*x + y*y 
main = print (fType 212124454 4454545445455454545445445454544545)

これで、次の出力が生成されます-

sh-4.3$ main
1984297512562793395882644631364297686099210302577374055141

浮く

次のコードを見てください。HaskellでFloatタイプがどのように機能するかを示しています-

fType :: Float -> Float -> Float 
fType x y = x*x + y*y 
main = print (fType 2.5 3.8)

この関数は、入力として2つのfloat値を取り、出力として別のfloat値を生成します。このコードをコンパイルして実行すると、次の出力が生成されます-

sh-4.3$ main
20.689999

ダブル

Double最後に倍精度の浮動小数点数です。次の例を見てください-

fType :: Double -> Double -> Double 
fType x y = x*x + y*y 
main = print (fType 2.56 3.81)

上記のコードを実行すると、次の出力が生成されます-

sh-4.3$ main 
21.0697

ブール

Boolブール型です。TrueまたはFalseのいずれかになります。次のコードを実行して、Haskellでブール型がどのように機能するかを理解します-

main = do  
   let x = True 
   
   if x == False 
      then putStrLn "X matches with Bool Type" 
   else putStrLn "X is not a Bool Type"

ここでは、変数「x」をブール値として定義し、それを別のブール値と比較して、その独創性を確認しています。次の出力が生成されます-

sh-4.3$ main
X is not a Bool Type

チャー

文字は文字を表します。一重引用符で囲まれたものはすべて文字と見なされます。次のコードでは、以前のコードを変更しましたfType() Char値を受け入れ、出力としてChar値を返す関数。

fType :: Char-> Char 
fType x = 'K' 
main = do  
   let x = 'v' 
   print (fType x)

上記のコードは fType() で機能する char'v'の値ですが、別のchar値、つまり 'K'を返します。これがその出力です-

sh-4.3$ main 
'K'

Haskellは宣言される前に型をキャッチするのに十分インテリジェントであるため、これらの型を明示的に使用しないことに注意してください。このチュートリアルの後続の章では、さまざまな型と型クラスがHaskellを強く型付けされた言語にする方法を説明します。

EQタイプクラス

EQ型クラスは、式の同等性をテストする機能を提供するインターフェースです。式の同等性をチェックしたいTypeクラスは、このEQ TypeClassの一部である必要があります。

上記のすべての標準型クラスはこの一部です EQクラス。上記のタイプのいずれかを使用して同等性をチェックしているときはいつでも、実際にはに電話をかけていますEQ 型クラス。

次の例では、 EQ 「==」または「/ =」操作を使用して内部的に入力します。

main = do 
   if 8 /= 8 
      then putStrLn "The values are Equal" 
   else putStrLn "The values are not Equal"

次の出力が得られます-

sh-4.3$ main 
The values are not Equal

Ord型クラス

Ordは、順序付けの機能を提供するもう1つのインターフェイスクラスです。全てのtypes これまで使用してきたことはその一部です Ordインターフェース。EQインターフェースと同様に、Ordインターフェースは、「>」、「<」、「<=」、「」、「比較」を使用して呼び出すことができます。

この型クラスの「比較」機能を使用した例を以下に示します。

main = print (4 <= 2)

ここで、Haskellコンパイラは4が2以下であるかどうかをチェックします。そうでないため、コードは次の出力を生成します。

sh-4.3$ main 
False

公演

Show引数を文字列として出力する機能があります。引数が何であれ、常に結果を文字列として出力します。次の例では、このインターフェイスを使用してリスト全体を印刷します。「show」を使用して、このインターフェースを呼び出すことができます。

main = print (show [1..10])

コンソールに次の出力が表示されます。ここで、二重引用符は、それが文字列型の値であることを示しています。

sh-4.3$ main 
"[1,2,3,4,5,6,7,8,9,10]"

読んだ

ReadインターフェイスはShowと同じことを行いますが、結果を文字列形式で出力しません。次のコードでは、read 文字列値を読み取り、それをInt値に変換するためのインターフェイス。

main = print (readInt "12") 
readInt :: String -> Int 
readInt = read

ここでは、文字列変数( "12")をに渡します。 readInt変換後に12(Int値)を返すメソッド。これがその出力です-

sh-4.3$ main 
12

列挙型

EnumHaskellのシーケンシャルまたは順序付き機能を有効にする別のタイプのTypeクラスです。この型クラスには、次のようなコマンドでアクセスできます。Succ, Pred, Bool, Char、など。

次のコードは、12の後続値を見つける方法を示しています。

main = print (succ 12)

次の出力が生成されます-

sh-4.3$ main
13

跳ねる

上限と下限を持つすべての型は、この型クラスに分類されます。例えば、Int タイプデータの最大境界は「9223372036854775807」、最小境界は「-9223372036854775808」です。

次のコードは、HaskellがInt型の最大値と最小値を決定する方法を示しています。

main = do 
   print (maxBound :: Int) 
   print (minBound :: Int)

次の出力が生成されます-

sh-4.3$ main
9223372036854775807
-9223372036854775808

ここで、Char、Float、およびBoolタイプの最大および最小境界を見つけてみてください。

この型クラスは、数値演算に使用されます。Int、Integer、Float、Doubleなどの型は、このTypeクラスに分類されます。次のコードを見てください-

main = do 
   print(2 :: Int)  
   print(2 :: Float)

次の出力が生成されます-

sh-4.3$ main
2
2.0

積分

IntegralNum型クラスのサブクラスと見なすことができます。Num Typeクラスはすべてのタイプの数値を保持しますが、Integralタイプクラスは整数にのみ使用されます。IntとIntegerは、このTypeクラスの型です。

フローティング

Integralと同様に、FloatingもNum Typeクラスの一部ですが、浮動小数点数のみを保持します。したがって、Float そして Double この型クラスに分類されます。

カスタムタイプクラス

他のプログラミング言語と同様に、Haskellでは開発者がユーザー定義の型を定義できます。次の例では、ユーザー定義型を作成して使用します。

data Area = Circle Float Float Float  
surface :: Area -> Float   
surface (Circle _ _ r) = pi * r ^ 2   
main = print (surface $ Circle 10 20 10 )

ここでは、という新しいタイプを作成しました Area。次に、このタイプを使用して円の面積を計算します。上記の例では、「サーフェス」は次の関数です。Area 入力として生成します Float 出力として。

ここでは「データ」がキーワードであり、Haskellのすべてのユーザー定義タイプは常に大文字で始まることに注意してください。

次の出力が生成されます-

sh-4.3$ main
314.15927