Programming-in-Haskell-2nd-edition_memo_3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[プログラミング Haskell 第 2 版 >Programming-in-Haskell-...
*プログラミング Haskell 第 2 版 [#geb86c87]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a...
}}
*第3章 型と型クラス [#h60e2933]
p.23
>型は、互いに関連する値の集合です。
>たとえば、Bool型にはFalseとTrueという二つの真理値が含ま...
また、「Bool -> Bool」という型には、Bool型をBool型へ変換...
>vが型 Tの値であるという意味で、「v :: T」という表記を使...
この形式を型注釈と呼びます。
「v :: T」は、「vの型は Tである」と読みます。
>以下に例を示します。
#code(haskell){{
False :: Bool
True :: Bool
not :: Bool -> Boo
}}
p.24
>GHCi では、:typeコマンドを式の前に付けると式の型が表示さ...
p.25
**3.2 基本型 [#he1ddef3]
>Char ――― 文字
Unicode のすべての単一文字が値として含まれる型です。
'a'、'A'、'3'、'_'といった通常の英語キーボードにあるすべ...
他の一般的なプログラミング言語と同様に、単一文字はシング...
>String ――― 文字列
"abc"、"1+2=3"、空文字列 ""のような文字の並びが値として含...
他の一般的なプログラミング言語と同様に、文字列はダブルク...
Haskellにおけるシングルクォートとダブルクォートの使い分け。
p.26
**3.3 リスト型 [#s91de05b]
>リストとは、同じ型の要素の並びであり、それらの要素を角括...
T型の要素を持つリストの型を [T]と書きます。
>以下に例を示します。
#code(haskell){{
[False,True,False] :: [Bool]
['a','b','c','d'] :: [Char]
["One","Two","Three"] :: [String]
}}
試しに確かめてみたら、String型にならなかった。Windows10だ...
*Main> :t ["One","Two","Three"]
["One","Two","Three"] :: [[Char]]
~
>リストの要素の個数を、そのリストの長さと呼びます。
>リスト[]は、長さが0 であり、空リストと呼ばれます。
[False]、['a']、[[]]は、要素が一つのリストです。
>[[]]と []は異なるリスト型の値であることに注意してくださ...
前者は空リストのみを含む長さ 1 のリストであり、後者は要素...
p.27
*3.4 タプル型 [#p99edc9d]
>タプルとは、有限個の要素の組です。
各要素の型が異なってもかまいません。
要素は括弧で囲み、カンマで区切ります。
タプルの型は、i番めの要素が型 Tiを持つとき、(T1,T2,...,Tn...
>
#code(haskell){{
(False,True) :: (Bool,Bool)
(False,'a',True) :: (Bool,Char,Bool)
("Yes",True,'a') :: (String,Bool,Char)
}}
試しに確かめてみたら、String型にならなかった。Windows10だ...
*Main> :t (False,True)
(False,True) :: (Bool, Bool)
*Main> :t (False,'a',True)
(False,'a',True) :: (Bool, Char, Bool)
*Main> :t ("Yes",True,'a')
("Yes",True,'a') :: ([Char], Bool, Char)
気になったので検索してみたら、String型は[Char]型の別名、...
-[[Haskell String型 [Char]型 - Google 検索>https://www.go...
-基本的なデータ型 - ウォークスルー Haskell http://walk.no...
>5. 文字列型
文字列型の型名は String で,リテラルは "hello" のようにダ...
&color(red){実は,文字列の実体は文字のリストであり,Strin...
文字列リテラル "hello" は文字のリスト ['h', 'e', 'l', 'l'...
それを先に言え!ってかんじですねw
Haskellのタプルは、注意点が多々あるので、何度もよく読んで...
**3.5 関数型 [#ob0bffca]
>関数は、ある型の引数を他の型の結果に変換します。
型 T1の引数を型 T2の返り値に変換する関数の型を「T1 -> T2...
p.28
>関数には、引数の型と結果の型に制限がありません。
>そこで、複数の値をリストかタプルで表現すれば、一つの引数...
>たとえば、整数の組を取り足し合わせた値を返す関数 addと、...
#code(haskell){{
add :: (Int,Int) -> Int
add (x,y) = x+y
zeroto :: Int -> [Int]
zeroto n = [0..n]
}}
>この例では、Haskell の慣習に従って、関数定義の前で関数の...
関数の型は、関数についての有益な説明になっています。
このような、プログラマーにより指定された型の情報は、型推...
**3.6 カリー化された関数 [#n33a4c22]
p.29
>一度に一つの引数を取る関数を、カリー化されていると表現し...
>カリー化された関数を扱うときに括弧が過剰になるのを避ける...
>一つは、型の中の ->は右結合であるという規則です。
たとえば、以下の型を考えましょう。
Int -> Int -> Int -> Int
これは、以下を意味します。
Int -> (Int -> (Int -> Int))
>もう一つは、空白文字を用いて表す関数適用は、必然的に左結...
たとえば、以下の関数適用を考えます。
mult x y z
これは、以下を意味します。
((mult x) y) z
>Haskell では、明示的に括弧付けをしなくても、複数の引数を...
また、二つの規則のおかげで、必要な括弧の個数を少なくでき...
p.30
**3.7 多相型 [#h974a668]
***型変数 [#q9207cd3]
>型に型変数を含めることで正確に表現できます。
型変数の先頭は小文字でなければなりません。
通常は、単にa、b、cという名前を使います。
たとえば、lengthの型は次のようになります。
length :: [a] -> Int
>すなわち、任意の型 aに対して、関数lengthは型「[a] -> Int...
一つ以上の型変数を含む型や、そのような型を持つ式は、多相...
したがって、型「[a] -> Int」は多相型で、lengthは多相関数...
一般的に、プレリュードで提供される関数の多くは多相的です。
「型変数」という用語の意味の定義が不十分な気がしたので、...
-[[Haskell 型変数 - Google 検索>https://www.google.com/se...
「型変数」は英語で「type variable」というらしい。
-[[【Haskell】 言葉の定義まとめ(型クラス、型コンストラク...
>
|言葉|説明|例|h
|型変数|関数の明示的な型宣言に使われる どんな型も取り得...
-[[Haskell の文法>http://mew.org/~kazu/academic/2013/miya...
>型変数を使って、型をパラメータ化することもできます。
data Maybe a = Nothing | Just a
型変数には、当然ですが具体的な型が入ります。
-[[Haskellの型入門 - NaCl非公式ブログ>https://nacl-ltd.gi...
>''型変数、型クラス''
add2 :: a -> a -> a
add2 x y = x + y
上記コードのaが 型変数 です。
サンプルでは型変数名にaを使っていますが、b, cや複数文字を...
この型変数は任意の型が入ることを示しています。
ただし同じ名前の型変数の型は、全て同じであることに注意し...
>
*Main> :t (+)
(+) :: Num a => a -> a -> a
Num a => は初めて見る書き方ですが、これは型変数aに対して...
型変数をそのまま使うと任意の型を許容してしまうため、型ク...
~
とりあえず、今の段階での理解を整理しておく。
-型変数は、任意の型(型情報)を保存する変数。
-型について記述するときに、とりあえず型変数を使って宣言し...
-型変数は、通常「a、b、c、…」のように小文字アルファベット...
-型変数は、最終的には具体的な型が当てはめられて処理される。
型を扱うための道具ということみたい。
~
(参考)型変数の意味とは直接関係ないかもしれないけど、型...
-[[Haskellにおける型レベルプログラミングの基本(翻訳) - Qi...
p.31
**3.8 多重定義型 [#vac0b80a]
***型クラス制約 [#id100ed9]
>型クラス制約は C aという形式で書きます。
ここで、Cは型クラス名、aは型変数です。
>たとえば、+の型は次のようになります。
(+) :: Num a => a -> a -> a
***多重定義型 [#c3847bd0]
>一つ以上の型クラス制約を持つ型は、多重定義型と呼ばれます。
そのような型を持つ関数は、多重定義されていると言われます。
>つまり、Num a => a -> a -> aは多重定義型であり、(+)は多...
プレリュードで提供される数値関連の関数の多くは多重定義さ...
**3.9 基本クラス [#e1d236a4]
>型は、互いに関連する値の集合であったことを思い出してくだ...
この考え方に従えば、型クラス(または単にクラス)とは、共...
ここで、メソッドとは、多重定義された操作のことを指します。
Haskell ではたくさんの基本クラスが標準で提供されています。
~
ここでいったん停止。
-「型クラス」
-「型クラス制約」
の説明が分かりづらかったので、別の説明方法を調べてみる。
~
***型クラスの補足 [#h2f5bc14]
-[[Haskell 型クラス制約 - Google 検索>https://www.google....
-[[型クラス - ウォークスルー Haskell>http://walk.northcol...
>1. 型クラスとは
型クラス(type class)は,データ型をカテゴライズする役割...
例えば,数値型全般を表す Num という型クラスは,数値型全般...
Num 型クラスの インスタンス(instance)は,具体的な数値型...
&ref(num_class.png);
~
-型は、互いに関連する値の集合
たとえば、Bool型にはFalseとTrueという二つの真理値が含まれ...
-型クラスは、互いに関連する「型」の集合
たとえば、Num型クラスには、具体的な数値型である Int や Do...
とりあえず今の段階では、型の集合が「型クラス」という理解...
>2. 型クラス制約
型クラスの存在意義がわかる簡単な例題として,リストの要素...
sum [] = 0
sum (x:xs) = x + sum xs
この関数 sum の型はどのように書くのが適切でしょうか.
次のように書いてしまうと,Int 以外の数値型のリストに sum ...
sum :: [Int] -> Int
かといって,次のような型だと,数値以外のリストにも sum を...
sum :: [a] -> a
そこで,型クラスを用いることで,数値のリストにのみ sum を...
sum :: Num a => [a] -> a
&color(red){この型シグネチャ宣言における => の左辺 Num a ...
この制約は,型クラス制約,あるいは文脈(context)と呼ばれ...
>複数の制約がある場合には,次の例のように書きます.
f :: (C a, D a, E b) => [a] -> [b] -> [a]
~
この説明が分かりやすい!
p.33
**Read ――― 読込可能クラス [#te63d12b]
p034.hs
#code(haskell){{
main = do
read "False" :: Bool
read "'a'" :: Char
read "123" :: Int
read "[1,2,3]" :: [Int]
read "('a',False)" :: (Char,Bool)
}}
このスクリプトをWinGHCiでロードして実行したら、エラーにな...
p034.hs:4:1: error:
? Couldn't match expected type ‘IO t0’ with actual t...
? In the expression: main
When checking the type of the IO action ‘main’
|
4 | main = do | ^
何かをimportしないと、read関数は使えないのだろうか?
もしくは、このdo記法では何か間違いがあるのだろうか?
エラーメッセージの意味もよく理解できない。
また、勉強が進んだ後で、デバッグしてみよう。
終了行:
[[プログラミング Haskell 第 2 版 >Programming-in-Haskell-...
*プログラミング Haskell 第 2 版 [#geb86c87]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a...
}}
*第3章 型と型クラス [#h60e2933]
p.23
>型は、互いに関連する値の集合です。
>たとえば、Bool型にはFalseとTrueという二つの真理値が含ま...
また、「Bool -> Bool」という型には、Bool型をBool型へ変換...
>vが型 Tの値であるという意味で、「v :: T」という表記を使...
この形式を型注釈と呼びます。
「v :: T」は、「vの型は Tである」と読みます。
>以下に例を示します。
#code(haskell){{
False :: Bool
True :: Bool
not :: Bool -> Boo
}}
p.24
>GHCi では、:typeコマンドを式の前に付けると式の型が表示さ...
p.25
**3.2 基本型 [#he1ddef3]
>Char ――― 文字
Unicode のすべての単一文字が値として含まれる型です。
'a'、'A'、'3'、'_'といった通常の英語キーボードにあるすべ...
他の一般的なプログラミング言語と同様に、単一文字はシング...
>String ――― 文字列
"abc"、"1+2=3"、空文字列 ""のような文字の並びが値として含...
他の一般的なプログラミング言語と同様に、文字列はダブルク...
Haskellにおけるシングルクォートとダブルクォートの使い分け。
p.26
**3.3 リスト型 [#s91de05b]
>リストとは、同じ型の要素の並びであり、それらの要素を角括...
T型の要素を持つリストの型を [T]と書きます。
>以下に例を示します。
#code(haskell){{
[False,True,False] :: [Bool]
['a','b','c','d'] :: [Char]
["One","Two","Three"] :: [String]
}}
試しに確かめてみたら、String型にならなかった。Windows10だ...
*Main> :t ["One","Two","Three"]
["One","Two","Three"] :: [[Char]]
~
>リストの要素の個数を、そのリストの長さと呼びます。
>リスト[]は、長さが0 であり、空リストと呼ばれます。
[False]、['a']、[[]]は、要素が一つのリストです。
>[[]]と []は異なるリスト型の値であることに注意してくださ...
前者は空リストのみを含む長さ 1 のリストであり、後者は要素...
p.27
*3.4 タプル型 [#p99edc9d]
>タプルとは、有限個の要素の組です。
各要素の型が異なってもかまいません。
要素は括弧で囲み、カンマで区切ります。
タプルの型は、i番めの要素が型 Tiを持つとき、(T1,T2,...,Tn...
>
#code(haskell){{
(False,True) :: (Bool,Bool)
(False,'a',True) :: (Bool,Char,Bool)
("Yes",True,'a') :: (String,Bool,Char)
}}
試しに確かめてみたら、String型にならなかった。Windows10だ...
*Main> :t (False,True)
(False,True) :: (Bool, Bool)
*Main> :t (False,'a',True)
(False,'a',True) :: (Bool, Char, Bool)
*Main> :t ("Yes",True,'a')
("Yes",True,'a') :: ([Char], Bool, Char)
気になったので検索してみたら、String型は[Char]型の別名、...
-[[Haskell String型 [Char]型 - Google 検索>https://www.go...
-基本的なデータ型 - ウォークスルー Haskell http://walk.no...
>5. 文字列型
文字列型の型名は String で,リテラルは "hello" のようにダ...
&color(red){実は,文字列の実体は文字のリストであり,Strin...
文字列リテラル "hello" は文字のリスト ['h', 'e', 'l', 'l'...
それを先に言え!ってかんじですねw
Haskellのタプルは、注意点が多々あるので、何度もよく読んで...
**3.5 関数型 [#ob0bffca]
>関数は、ある型の引数を他の型の結果に変換します。
型 T1の引数を型 T2の返り値に変換する関数の型を「T1 -> T2...
p.28
>関数には、引数の型と結果の型に制限がありません。
>そこで、複数の値をリストかタプルで表現すれば、一つの引数...
>たとえば、整数の組を取り足し合わせた値を返す関数 addと、...
#code(haskell){{
add :: (Int,Int) -> Int
add (x,y) = x+y
zeroto :: Int -> [Int]
zeroto n = [0..n]
}}
>この例では、Haskell の慣習に従って、関数定義の前で関数の...
関数の型は、関数についての有益な説明になっています。
このような、プログラマーにより指定された型の情報は、型推...
**3.6 カリー化された関数 [#n33a4c22]
p.29
>一度に一つの引数を取る関数を、カリー化されていると表現し...
>カリー化された関数を扱うときに括弧が過剰になるのを避ける...
>一つは、型の中の ->は右結合であるという規則です。
たとえば、以下の型を考えましょう。
Int -> Int -> Int -> Int
これは、以下を意味します。
Int -> (Int -> (Int -> Int))
>もう一つは、空白文字を用いて表す関数適用は、必然的に左結...
たとえば、以下の関数適用を考えます。
mult x y z
これは、以下を意味します。
((mult x) y) z
>Haskell では、明示的に括弧付けをしなくても、複数の引数を...
また、二つの規則のおかげで、必要な括弧の個数を少なくでき...
p.30
**3.7 多相型 [#h974a668]
***型変数 [#q9207cd3]
>型に型変数を含めることで正確に表現できます。
型変数の先頭は小文字でなければなりません。
通常は、単にa、b、cという名前を使います。
たとえば、lengthの型は次のようになります。
length :: [a] -> Int
>すなわち、任意の型 aに対して、関数lengthは型「[a] -> Int...
一つ以上の型変数を含む型や、そのような型を持つ式は、多相...
したがって、型「[a] -> Int」は多相型で、lengthは多相関数...
一般的に、プレリュードで提供される関数の多くは多相的です。
「型変数」という用語の意味の定義が不十分な気がしたので、...
-[[Haskell 型変数 - Google 検索>https://www.google.com/se...
「型変数」は英語で「type variable」というらしい。
-[[【Haskell】 言葉の定義まとめ(型クラス、型コンストラク...
>
|言葉|説明|例|h
|型変数|関数の明示的な型宣言に使われる どんな型も取り得...
-[[Haskell の文法>http://mew.org/~kazu/academic/2013/miya...
>型変数を使って、型をパラメータ化することもできます。
data Maybe a = Nothing | Just a
型変数には、当然ですが具体的な型が入ります。
-[[Haskellの型入門 - NaCl非公式ブログ>https://nacl-ltd.gi...
>''型変数、型クラス''
add2 :: a -> a -> a
add2 x y = x + y
上記コードのaが 型変数 です。
サンプルでは型変数名にaを使っていますが、b, cや複数文字を...
この型変数は任意の型が入ることを示しています。
ただし同じ名前の型変数の型は、全て同じであることに注意し...
>
*Main> :t (+)
(+) :: Num a => a -> a -> a
Num a => は初めて見る書き方ですが、これは型変数aに対して...
型変数をそのまま使うと任意の型を許容してしまうため、型ク...
~
とりあえず、今の段階での理解を整理しておく。
-型変数は、任意の型(型情報)を保存する変数。
-型について記述するときに、とりあえず型変数を使って宣言し...
-型変数は、通常「a、b、c、…」のように小文字アルファベット...
-型変数は、最終的には具体的な型が当てはめられて処理される。
型を扱うための道具ということみたい。
~
(参考)型変数の意味とは直接関係ないかもしれないけど、型...
-[[Haskellにおける型レベルプログラミングの基本(翻訳) - Qi...
p.31
**3.8 多重定義型 [#vac0b80a]
***型クラス制約 [#id100ed9]
>型クラス制約は C aという形式で書きます。
ここで、Cは型クラス名、aは型変数です。
>たとえば、+の型は次のようになります。
(+) :: Num a => a -> a -> a
***多重定義型 [#c3847bd0]
>一つ以上の型クラス制約を持つ型は、多重定義型と呼ばれます。
そのような型を持つ関数は、多重定義されていると言われます。
>つまり、Num a => a -> a -> aは多重定義型であり、(+)は多...
プレリュードで提供される数値関連の関数の多くは多重定義さ...
**3.9 基本クラス [#e1d236a4]
>型は、互いに関連する値の集合であったことを思い出してくだ...
この考え方に従えば、型クラス(または単にクラス)とは、共...
ここで、メソッドとは、多重定義された操作のことを指します。
Haskell ではたくさんの基本クラスが標準で提供されています。
~
ここでいったん停止。
-「型クラス」
-「型クラス制約」
の説明が分かりづらかったので、別の説明方法を調べてみる。
~
***型クラスの補足 [#h2f5bc14]
-[[Haskell 型クラス制約 - Google 検索>https://www.google....
-[[型クラス - ウォークスルー Haskell>http://walk.northcol...
>1. 型クラスとは
型クラス(type class)は,データ型をカテゴライズする役割...
例えば,数値型全般を表す Num という型クラスは,数値型全般...
Num 型クラスの インスタンス(instance)は,具体的な数値型...
&ref(num_class.png);
~
-型は、互いに関連する値の集合
たとえば、Bool型にはFalseとTrueという二つの真理値が含まれ...
-型クラスは、互いに関連する「型」の集合
たとえば、Num型クラスには、具体的な数値型である Int や Do...
とりあえず今の段階では、型の集合が「型クラス」という理解...
>2. 型クラス制約
型クラスの存在意義がわかる簡単な例題として,リストの要素...
sum [] = 0
sum (x:xs) = x + sum xs
この関数 sum の型はどのように書くのが適切でしょうか.
次のように書いてしまうと,Int 以外の数値型のリストに sum ...
sum :: [Int] -> Int
かといって,次のような型だと,数値以外のリストにも sum を...
sum :: [a] -> a
そこで,型クラスを用いることで,数値のリストにのみ sum を...
sum :: Num a => [a] -> a
&color(red){この型シグネチャ宣言における => の左辺 Num a ...
この制約は,型クラス制約,あるいは文脈(context)と呼ばれ...
>複数の制約がある場合には,次の例のように書きます.
f :: (C a, D a, E b) => [a] -> [b] -> [a]
~
この説明が分かりやすい!
p.33
**Read ――― 読込可能クラス [#te63d12b]
p034.hs
#code(haskell){{
main = do
read "False" :: Bool
read "'a'" :: Char
read "123" :: Int
read "[1,2,3]" :: [Int]
read "('a',False)" :: (Char,Bool)
}}
このスクリプトをWinGHCiでロードして実行したら、エラーにな...
p034.hs:4:1: error:
? Couldn't match expected type ‘IO t0’ with actual t...
? In the expression: main
When checking the type of the IO action ‘main’
|
4 | main = do | ^
何かをimportしないと、read関数は使えないのだろうか?
もしくは、このdo記法では何か間違いがあるのだろうか?
エラーメッセージの意味もよく理解できない。
また、勉強が進んだ後で、デバッグしてみよう。
ページ名: