Hatena::Groupbluespear

bluespearの勉強メモ

2008-05-19

[]リストパターン 10:21

ワイルドカード "_"

いきなりリスト関係ないけど、いかなるパターンとも照合するワイルドカード _ 。パターンマッチには使いたいけど、バインドする必要はないときに使う。

リストパターン

リストは"頭とそれ以外"で表現できる。

(x:xs)
(x:[]) = [x]
[] --空リストに照合

":"はリスト構成の固有な構成法である。固有の構成子をコンスというらしい。++は固有ではないのでコンスじゃない。


教科書問題

7.1

addOne :: [Int] -> Int
addOne [] = 0
addOne (x:_) = x + 1

7.2

addTwo :: [Int] -> Int
addTwo [] = 0
addTwo (x:[]) = x
addTwo (x1:x2:_) = x1 + x2

7.3

addOne :: [Int] -> Int
addOne xs
  | xs == [] = 0
  | otherwise = head xs + 1

addTwo :: [Int] -> Int
addTwo xs
  | xs == [] = 0
  | length xs == 1 = head xs
  | otherwise = head xs + head(tail xs)

原始再起定義

基本的に

f [] = ...
f (x:xs) = ... fm xs

という形で定義される。

パタンにおける変数繰り返しの禁止
elem :: Int -> [Int] -> Bool
elem x (x:ys) = True
elem x (y:ys) = elem ys

ERROR file:.\test.hs:2 - Repeated variable "x" in pattern

教科書問題

7.6

elemNum :: Int -> [Int] -> Int
elemNum [] = 0
elemNum x (y:ys)
  | x == y = 1 + elemNum x ys
  | otherwise =  elemNum x ys

7.8

unzip :: [(a,b)] -> ([a],[b])
unzip [] = ([],[])
unzip ((a,b):xs) = (a:as, b:bs)
  where (as,bs) = unzip xs

2008-05-12

[]タプル 10:22

2つ以上の値をまとめたもの。要素は別々の型でも良い。1要素タプルは存在しない。タプルの各要素は定義通りの順番でないといけない。

(123, "OneTwoThree")   :: (Int, String)
("String", [1,2,3,4])  :: ([Char], [Int])

0要素のタプルをユニットという。() :: ()

関数

fst, snd
2要素タプルの第一、第二要素を返す
zip
ふたつのリストから2要素タプルを生成。文字通りZipする。
unzip
zipの逆。2要素タプルのリストから(第一要素のリスト,第二要素のリスト)となるタプルを返す。

参考リンク

[]リスト 10:22

特定の型を任意個並べたもの。

[]          :: []
[1, 2, 3]   :: [Int]
"abc"       :: [Char] 
['a', 'b', 'c'] :: String
--関数のリスト
[fac,fastFib] :: [Int -> Int]

":"演算子リストの先頭とそれ以外に分けられる。

[1,2,3]
1:[2,3]
1:2:[3]
1:2:3:[]

数列表現

[1..5]みたいにかける。[1,3..]のようにすると無限リストになる。

リスト内包表記

数学の表現とにている。値がBoolとなる検査式も含めることができる。

Main> [(x,y) | x <- [1..5], y <- [6..10], x+y > 10]
[(1,10),(2,9),(2,10),(3,8),(3,9),(3,10),(4,7),(4,8),(4,9),(4,10),(5,6),(5,7),(5,8),(5,9),(5,10)]
参考リンク

2008-04-21

[]講義2回目 メモ 10:23

教室飽和これはひどい

前の行の空白以外の最初の左端寄りのトークンより左端寄りにあるトークンが新たな宣言の開始として解釈される。

ガード

foo :: Int -> Int -> Int
foo x y
  | x > y = x
  | otherwise = y

関数定義で使う。上から評価して、初めにTrueになる定義が使われる。| と =の間にあるのがガード。

otherwisePreludeモジュールで定義されている

otherwise = true

だそうな。

参考

2008-04-14

[]関数プログラミング講義1回目まとめ 23:24

自分用のまとめ。けど、試験には手書きノートかA4の紙のどちらかの持込しか認めないとか。えー。検索出来ないじゃん。

雑多な事柄

Haskellの文法関係

関数適用

演算子より関数適用の方が優先

数学的表現Haskell
f(x)f x
f(x, y)f x y
f(x, y) + 2 f x y + 2
f(x, y+2)f x (y + 2)
定義
name :: type
name = expression
--具体例
size :: Int
size = 12 + 13

関数入力の型と出力の型を -> でつなぐ

--関数
--name :: 仮引数1の型 ->仮引数2の型 -> ... -> eの型
--name x1 x2 x3 ... kx = e

--例
square Int -> Int
square n = n*n

ちなみにHaskell型推論があるから型の宣言は省略できるらしい。(型推論に関しては バリケンのHaskell日記 - haskell 参考))

関数の合成
f = g . h
関数演算子

演算子を括弧でくくると関数的に書ける。2値引数関数を逆クォートでくくると演算子的に書ける。

x + y = (+) x y

f x y = x `f` y

モジュール
--モジュールを導入
module Ant where
--他のモジュールを読み込む
import Bee

として読み込む。詳しくはModule参照。

名前が無いモジュールはMainと呼ばれ、これがプロンプトでの最上位のモジュール。だからMain> と表示される。

map関数

mapは、リストの各要素に対して関数を適用する。

map f [a, b, c] = [f a, f b, f c]

++演算子

++ はリストを結合する

Main> [1, 2, 3] ++ [4, 5, 6]
[1,2,3,4,5,6]
zipWith関数

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

zipWith関数は二引数関数を使って二つのリストを混ぜ合わせます。

http://haskell.g.hatena.ne.jp/hyuki/20060603/zipwith
Main> zipWith (++) [[1,2],[2,3]] [[4,5],[6,7]]
[[1,2,4,5],[2,3,6,7]]