02ゼロから
10202 ワード
インタラクティブ環境での簡単なテスト
コマンドラインプロンプトの設定:set prompt "ghci>"
しじえんざん
ghci> 2 + 15
17
ghci> 49 * 100
4900
ghci> 1892 - 1472
420
ghci> 5 / 2
2.5
ghci>
かっこの優先度の変更
ghci> (50 * 100) - 4999
1
ghci> 50 * 100 - 4999
1
ghci> 50 * (100 - 4999)
-244950
ブール演算
ghci> True && False
False
ghci> True && True
True
ghci> False || True
True
ghci> not False
True
ghci> not (True && True)
False
そうとうせいけってい
ghci> 5 == 5
True
ghci> 1 == 0
False
ghci> 5 /= 5
False
ghci> 5 /= 4
True
ghci> "hello" == "hello"
True
タイプエラー
関数に渡されるパラメータのタイプは、要求に合致する必要があります.そうしないと、エラーが発生します.ghci> 5+"llama"
No instance for (Num [Char])
arising from a use of `+' at :1:0-9
Possible fix: add an instance declaration for (Num [Char])
In the expression: 5 + "llama"
In the definition of `it': it = 5 + "llama"
呼び出し関数
関数呼び出しにはカッコは必要ありません.パラメータ間はスペースで区切られます.ghci> succ 8
9
ghci> min 9 10
9
ghci> min 3.4 3.2
3.2
ghci> max 100 101
101
関数の優先度が高い
関数は右結合ですghci> succ 9 + max 5 4 + 1
16
ghci> (succ 9) + (max 5 4) + 1
16
カスタム関数
Haskellのカスタム関数は、数学の関数と非常に似ています.たとえば、f(x) = x + x
などです.
次の関数では、1つの数に2
を乗算します.doubleMe x = x + x
保存してロード
baby.hs
ファイルとして保存し、:l
命令でロードします.ghci> :l baby
[1 of 1] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.
ghci> doubleMe 9
18
ghci> doubleMe 8.3
16.6
分岐式if...then ... else ...
*Haskell**で
ghci> 2 + 15
17
ghci> 49 * 100
4900
ghci> 1892 - 1472
420
ghci> 5 / 2
2.5
ghci>
ghci> (50 * 100) - 4999
1
ghci> 50 * 100 - 4999
1
ghci> 50 * (100 - 4999)
-244950
ghci> True && False
False
ghci> True && True
True
ghci> False || True
True
ghci> not False
True
ghci> not (True && True)
False
ghci> 5 == 5
True
ghci> 1 == 0
False
ghci> 5 /= 5
False
ghci> 5 /= 4
True
ghci> "hello" == "hello"
True
ghci> 5+"llama"
No instance for (Num [Char])
arising from a use of `+' at :1:0-9
Possible fix: add an instance declaration for (Num [Char])
In the expression: 5 + "llama"
In the definition of `it': it = 5 + "llama"
ghci> succ 8
9
ghci> min 9 10
9
ghci> min 3.4 3.2
3.2
ghci> max 100 101
101
ghci> succ 9 + max 5 4 + 1
16
ghci> (succ 9) + (max 5 4) + 1
16
Haskellのカスタム関数は、数学の関数と非常に似ています.たとえば、
f(x) = x + x
などです.次の関数では、1つの数に
2
を乗算します.doubleMe x = x + x
保存してロード
baby.hs
ファイルとして保存し、:l
命令でロードします.ghci> :l baby
[1 of 1] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.
ghci> doubleMe 9
18
ghci> doubleMe 8.3
16.6
分岐式if...then ... else ...
*Haskell**で
if
文は式であるため、戻り値のあるeles
文doubleSmallNumber x = if x > 100
then x
else x*2
if
文は式であるため、最終的には値に簡略化できるため、どこでも使用できます.doubleSmallNumber' x = (if x > 100 then x else x*2) + 1
関数の命名規則
List入門
Listは本質的にシーケンスであり、他の動的言語とは異なり、シーケンス内の項目は同じタイプである
注意:インタラクティブな環境では、let
で変数を定義する必要があります.ghci> let lostNumbers = [4,8,15,16,23,48]
ghci> lostNumbers
[4,8,15,16,23,48]
++連結演算
[1,2,3,4] ++ [9,10,11,12] == [1,2,3,4,9,10,11,12]
:リストヘッダに要素を追加します。高速です。
'A' : " SMALL CAT" == "A SMALL CAT"
5:[1,2,3,4,5] == [5,1,2,3,4,5]
[]空のリスト
空のリストはリストの最内層要素であり、リストは実際には一連の列接続演算の構文糖である.[1,2,3] == 1:2:3:[]
ghci> let lostNumbers = [4,8,15,16,23,48]
ghci> lostNumbers
[4,8,15,16,23,48]
[1,2,3,4] ++ [9,10,11,12] == [1,2,3,4,9,10,11,12]
'A' : " SMALL CAT" == "A SMALL CAT"
5:[1,2,3,4,5] == [5,1,2,3,4,5]
[1,2,3] == 1:2:3:[]
!!
インデックスリストの要素は、境界"Steve Buscemi" !! 6 == 'B'
[9.4,33.2,96.2,11.2,23.25]!! 1 == 33.2
リスト内のリスト
リストはネストできますが、サブリストのタイプは同じでなければなりません.
ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
ghci> b
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
ghci> b ++ [[1,1,1,1]]
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]
ghci> [6,6,6]:b
[[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
ghci> b !! 2
[1,2,2,3,4]
リスト比較サイズ
リストはサイズを比較できますが、比較するときに要素を順番に比較します.
ghci> [3,2,1] > [2,1,0]
True
ghci> [3,2,1] > [2,10,100]
True
ghci> [3,4,2] > [3,4]
True
ghci> [3,4,2] > [2,4]
True
ghci> [3,4,2] == [3,4,2]
True
headリストのヘッダを取り出す
head [5,4,3,2,1] == 5
テイル頭以外の部分を取り出す
tail [5,4,3,2,1] == [4,3,2,1]
リストの末尾を取り出す
last [5,4,3,2,1] == 1
Init尾以外の部分を取り出す
init [5,4,3,2,1] == [5,4,3,2]
注:上の4つの関数が空のリストを処理するとエラーが発生します.
ghci> head []
*** Exception: Prelude.head: empty list
lengthはリストの長さを返す
ghci> length [5,4,3,2,1]
5
nullリストが空かどうかをチェック
ghci> null [1,2,3]
False
ghci> null []
True
reverseリストを反転
ghci> reverse [5,4,3,2,1]
[1,2,3,4,5]
takeはリストの最初の要素を返します
take 0
エレメントであれば、空のLisが得られます!ghci> take 3 [5,4,3,2,1]
[5,4,3]
ghci> take 1 [3,9,3]
[3]
ghci> take 5 [1,2]
[1,2]
ghci> take 0 [6,6,6]
[]
dropリストの最初の要素を削除
ghci> drop 3 [8,4,2,1,5,6]
[1,5,6]
ghci> drop 0 [1,2,3,4]
[1,2,3,4]
ghci> drop 100 [1,2,3,4]
[]
maximumはリスト内の最大要素を返します
minimunはリストの最小要素を返します
ghci> minimum [8,4,2,1,5,6]
1
ghci> maximum [1,9,2,3,4]
9
sumはリスト内のすべての要素の和を返します。
productはリスト内のすべての要素の積を返します。
ghci> sum [5,2,1,6,3,2,5,7]
31
ghci> product [6,2,1,2]
24
ghci> product [1,2,5,6,7,9,2,0]
0
Elemは、要素がリストにあるかどうかを判断します。
ghci> 4 `elem` [3,4,5,6]
True
ghci> 10 `elem` [3,4,5,6]
False
Rangeの使用 Range
は、順序付けされたシーケンスを定義することができる
シーケンスとは数学上の数列に類似しており、増加または減少することができる.[1..20] == [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
['a'..'z'] == "abcdefghijklmnopqrstuvwxyz"
['K'..'Z'] == "KLMNOPQRSTUVWXYZ"
シーケンスの間隔を指定できます[2,4..20] == [2,4,6,8,10,12,14,16,18,20]
[3,6..20] == [3,6,9,12,15,18]
浮動小数点数を使用してシーケンスを作成しないでください.正確ではありません.[0.1, 0.3 .. 1] == [0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
ふかっせい
cycle無限ループのシーケンスを作成する
take 10 (cycle [1,2,3]) == [1,2,3,1,2,3,1,2,3,1]
take 12 (cycle"LOL ") == "LOL LOL LOL "
repeat無限長のシーケンスを作成する
take 10 (repeat 5) == [5,5,5,5,5,5,5,5,5,5]
リスト解析
リスト解析は本質的に代数上の集合変換である.次に、シーケンス内の要素を2倍にします.[x*2 | x
じょうけんろか
集合にフィルタ条件を設定できます.条件に一致する項目は新しいリストに入ります.
次の条件は、シーケンス内の2倍化後に12
より大きい要素のみを2倍化して新しいシーケンスに入ることです.[x*2 | x = 12] == [12,14,16,18,20]
50
から100
の間に7
を除いた3
の要素をすべて取ります.[ x | x
注:条件はカンマで区切られています
たじょうけんろか
複数のフィルタ条件を設定できます[ x | x
複数リストの解析
複数のシーケンスを1つのシーケンスに変換し、各
[1..20] == [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
['a'..'z'] == "abcdefghijklmnopqrstuvwxyz"
['K'..'Z'] == "KLMNOPQRSTUVWXYZ"
[2,4..20] == [2,4,6,8,10,12,14,16,18,20]
[3,6..20] == [3,6,9,12,15,18]
[0.1, 0.3 .. 1] == [0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
cycle無限ループのシーケンスを作成する
take 10 (cycle [1,2,3]) == [1,2,3,1,2,3,1,2,3,1]
take 12 (cycle"LOL ") == "LOL LOL LOL "
repeat無限長のシーケンスを作成する
take 10 (repeat 5) == [5,5,5,5,5,5,5,5,5,5]
リスト解析
リスト解析は本質的に代数上の集合変換である.次に、シーケンス内の要素を2倍にします.[x*2 | x
じょうけんろか
集合にフィルタ条件を設定できます.条件に一致する項目は新しいリストに入ります.
次の条件は、シーケンス内の2倍化後に12
より大きい要素のみを2倍化して新しいシーケンスに入ることです.[x*2 | x = 12] == [12,14,16,18,20]
50
から100
の間に7
を除いた3
の要素をすべて取ります.[ x | x
注:条件はカンマで区切られています
たじょうけんろか
複数のフィルタ条件を設定できます[ x | x
複数リストの解析
複数のシーケンスを1つのシーケンスに変換し、各
[x*2 | x
[x*2 | x = 12] == [12,14,16,18,20]
[ x | x
[ x | x
[ x*y | x 50] == [55,80,100,110]
ぜんはいち
複数のシーケンスを解析するときは全配列の組み合わせです
ghci> let nouns = ["hobo","frog","pope"]
ghci> let adjectives = ["lazy","grouchy","scheming"]
ghci> [adjective ++ " " ++ noun | adjective
リスト解析でlength関数を実現する
リストの要素が何であるかにかかわらず、下線で代用できます.
length' xs = sum [1 | _
大文字のフィルタ
条件付きフィルタで大文字をフィルタリングします
注意:ここでは
\
elem`関数を使用しています.removeNonUppercase st = [ c | c removeNonUppercase "Hahaha! Ahahaha!"
"HA"
ghci> removeNonUppercase "IdontLIKEFROGS"
"ILIKEFROGS"
ネストされたリストの解析
解析されたアイテムがリストであれば、再度解析できます.
ghci> let xxs = [[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]]
ghci> [ [ x | x
メタグループ
リストは配列のようで、メタグループはベクトルのようで、各要素は1つの成分です.
メタグループには独自のデータ型があり、成分の数とタイプがメタグループのタイプを決定します.メタグループのタイプが異なるため、次のようなリストは間違っています.[(1,2),(8,11,5),(4,5)]
Couldn't match expected type `(t, t1)'
against inferred type `(t2, t3, t4)'
In the expression: (8, 11, 5)
In the expression: [(1, 2), (8, 11, 5), (4, 5)]
In the definition of `it': it = [(1, 2), (8, 11, 5), (4, 5)]
タプル比較サイズ
Prelude> (1,2,3)>(2,3,4)
False
一元グループなし
最も短いメタグループにも2つの成分があるべきで、二メタグループまたはシーケンスペアと呼ばれます.
一元グループは意味がなく、データ自体です.Prelude> (2)
2
Prelude> (1,2)
(1,2)
二元グループの成分をとる
[(1,2),(8,11,5),(4,5)]
Couldn't match expected type `(t, t1)'
against inferred type `(t2, t3, t4)'
In the expression: (8, 11, 5)
In the expression: [(1, 2), (8, 11, 5), (4, 5)]
In the definition of `it': it = [(1, 2), (8, 11, 5), (4, 5)]
Prelude> (1,2,3)>(2,3,4)
False
Prelude> (2)
2
Prelude> (1,2)
(1,2)
fst
の取り出しシーケンスのうちの第1の成分snd
取り出しシーケンスのうちの第2の成分注意:
fst
snd
この2つの関数は2元グループしか処理できず、多重グループを処理できません.ghci> fst (8,11)
8
ghci> fst ("Wow", False)
"Wow"
ghci> snd (8,11)
11
ghci> snd ("Wow", False)
False
zip関数
zip
関数は、2つのリストの要素を組み合わせて、2元グループのリストにすることができます.注意:リスト解析処理では全配列になりますが、
map
でよろしいでしょうか.ghci> zip [1,2,3,4,5] [5,5,5,5,5]
[(1,5),(2,5),(3,5),(4,5),(5,5)]
ghci> zip [1 .. 5] ["one", "two", "three", "four", "five"]
[(1,"one"),(2,"two"),(3,"three"),(4,"four"),(5,"five")]
長さの異なるリストも組み合わせられ、短いものを基準としています
ghci> zip [1..] ["apple", "orange", "cherry", "mango"]
[(1,"apple"),(2,"orange"),(3,"cherry"),(4,"mango")]
リスト解析によるメタグループのリストの構築
質問:すべての辺の長さが
10
以下で、周長が24
に等しい直角三角形を見つけます.注意:ここの解析条件は3つの解析変数を用いて演算されます.
ghci> let rightTriangles' =
[(a,b,c) | c rightTriangles'
[(6,8,10)]