Wednesday, July 23, 2014

Haskell part2

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