part2
タプル
リストと似てるけどちょっと違う。レコードっていう言語もある。
*Main> [("yukarin", 1), ("makky", 2), ("zunchan", 3)]
[("yukarin",1),("makky",2),("zunchan",3)]
*Main> [("yukarin", 1), ("makky", 2), ("zunchan", 3, 1)]
<interactive>:181:32:
Couldn't match expected type `([Char], t0)'
with actual type `([Char], t1, t2)'
In the expression: ("zunchan", 3, 1)
In the expression:
[("yukarin", 1), ("makky", 2), ("zunchan", 3, 1)]
In an equation for `it':
it = [("yukarin", 1), ("makky", 2), ("zunchan", 3, 1)]
*Main> [("yukarin", 1), ("makky", 2), ("zunchan", "1")]
<interactive>:183:14:
No instance for (Num [Char]) arising from the literal `1'
Possible fix: add an instance declaration for (Num [Char])
In the expression: 1
In the expression: ("yukarin", 1)
In the expression: [("yukarin", 1), ("makky", 2), ("zunchan", "1"
タプルのリストを定義したときに最初に違いが現れる。
- リスト内のタプルは同じ要素数、同じ型の並びでなければならない。
リストとの組み合わせ
*Main> ("Yukari", [1..5])
("Yukari",[1,2,3,4,5])
*Main> [("Yukarin", 1), ("Makky", 2)]
[("Yukarin",1),("Makky",2)]
リストを内包してもいいし、されてもいいみたい。
タプルに対する操作
fst, snd
*Main> fst ("Yukari", "Yuzuki")
"Yukari"
*Main> fst ("Yukari", "Yuzuki", 18)
<interactive>:196:5:
Couldn't match expected type `(a0, b0)'
with actual type `([Char], [Char], t0)'
In the first argument of `fst', namely `("Yukari", "Yuzuki", 18)'
In the expression: fst ("Yukari", "Yuzuki", 18)
In an equation for `it': it = fst ("Yukari", "Yuzuki", 18)
ペアの最初の要素を取得する。従って3要素のタプルでは失敗する。
*Main> snd ("Yukari", "Yuzuki")
"Yuzuki"
タプルの2番目の要素を取得する。
zip
ペアのリストを作るかっこいい関数。
*Main> zip [x | x <- [1..10], even x] [y | y <- [1..10], not (even y)]
[(2,1),(4,3),(6,5),(8,7),(10,9)]
*Main> zip [x | x <- [1..10], even x] [y | y <- [10..100], not (even y)]
[(2,11),(4,13),(6,15),(8,17),(10,19)]
条件付きリストのようにあらゆる組み合わせを試すのではなく、短いほうのリストの長さに合わせてペア(のリスト)を作ってくれる。
*Main> zip [1..] ["yukari", "maki", "zunko"]
[(1,"yukari"),(2,"maki"),(3,"zunko")]
遅延評価機能と合わせて、こんな風にかけるのはかっこいい。
条件付きリストとタプル
辺の長さが1..10までの全ての三角形。
*Main> let triangles = [(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10]]
1000パターンある。この内、正三角形の条件を満たすもの。
*Main> let triangles = [(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2]
*Main> triangles
[(4,3,5),(3,4,5),(8,6,10),(6,8,10)]
一行で表現できちゃうからなー。
ここまでで「starting-out」が終わった。
Written with StackEdit.
No comments:
Post a Comment