Haskell勉強中
「Learn You a Haskell for Great Good!」という本の一部を翻訳します。
次のような記述で考えると、
まず、Test a というタイプコンストラクタを宣言しています。
このaには、Intなどのタイプがきます。
つぎに、Test a a [Char]が、データのコンストラクタで、aがIntの場合、
Test Int Int [Char]と等価です。
関数mySumの定義をみると、ここは、宣言したデータ型 Test aを引数にとり、aを返す、となります。
具体例では、Test Int -> Int です。
関数の実装は、Test a型の値を受け取り、演算しています。
それぞれ、型を記述しているのか、値を記述しているのか、考える必要があるのです。
(実施結果)
「Learn You a Haskell for Great Good!」という本の一部を翻訳します。
タイプのコンストラクタと値のコンストラクタを区別することが重要です。
データタイプを宣言したとき、「=」より左側は、タイプのコンストラクタです。
右側は、値のコンストラクタです。
次のような記述で考えると、
data Test a = Test a a [Char]
mySum :: (Num a ) => Test a -> a
mySum (Test x y _) = x + y
まず、Test a というタイプコンストラクタを宣言しています。
このaには、Intなどのタイプがきます。
つぎに、Test a a [Char]が、データのコンストラクタで、aがIntの場合、
Test Int Int [Char]と等価です。
関数mySumの定義をみると、ここは、宣言したデータ型 Test aを引数にとり、aを返す、となります。
具体例では、Test Int -> Int です。
関数の実装は、Test a型の値を受け取り、演算しています。
それぞれ、型を記述しているのか、値を記述しているのか、考える必要があるのです。
(実施結果)
*Main> mySum (Test 1.0 2.0 "abc")
3.0