覚書
概念はわかっても,用語が慣れないのでその辺をリストしたい.
用語
- アクション (ex. main アクション)
- 適用する(ex. "Hello, World!"にputStrLn 関数を適用する)
- レイアウト,オフサイドルール
- 束縛する (<-.do の中とかちょっと限定的)
- リスト
- パターンマッチ
- モジュール
- タプル (ユニット => ())
- リスト内包表記 - [abs x | x <- xs]
- ワイルドカード _
- 無名関数 - \パターン1 パターン2 -> 式
- 関数合成 - f . g
- 部分適用 - セクション
- ポイントフリースタイル - 関数を関数で定義するコーディングスタイル
用語 - 型
- 型変数 - 任意の型
- 多相型 - 型変数を含む型
- 代数的データ型 - data宣言 - 型コンストラクタ / データコンストラクタ
- フィールドラベル - ex. A { aUrl :: String, aLabel :: String }
- セレクタ - フィールドアクセスの関数
- type 宣言 - 型の別名
- newtype 宣言 - 新しい型の宣言
- 型クラス - 制約 -> class 宣言
- アドホック多相 (制約あり) <=> パラメータ多相
- クラスメソッド - 型クラスの特徴
- 多重定義 - 型ごとに違う実装のクラスメソッドが定義できる
- 型クラスの継承
- instance 宣言 - 型を型クラスのインスタンスであると宣言する
- deriving 宣言 - instance 宣言を自動生成する
モジュール
- module A (method1, method2) where - メソッドのエクスポート
- module A (SomeType(ConsA), a, b, c) where - データコンストラクタのエクスポート
- module A (SomeType(..)) where - すべてのデータコンストラクタのエクスポート
- module A (module B) where - モジュールの再エクスポート
- module Main (main) where - module と書かなかった場合の補完される宣言
- import A - モジュールを全部インポートする
- import A (XXX) - 指定したXXX のみをインポートする
- import A hiding (XXX) - XXX 以外をインポートする
- import qualified A - 完全修飾名でのみインポートする
- import qualified A as B - モジュール名の別名を定義する
型
- Int
- Char
- String
- Bool
- [a] - リスト
- a - 型変数 →多相型
アクション
- getContents
- System.getArgs :: IO [String]
関数
- putStr
- lines - 分割するときに改行文字は取り除かれる
- unlines - 改行文字を付加して連結する
- length
- print - 値を文字列化して標準出力に出力するアクションを返す
- take - 先頭からn 要素を取って返す
- reverse
- map :: (a -> b) -> [a] -> [b]
- concat :: a -> [a] - リストを一重減らす
- concatMap :: (a -> [b]) -> [a] -> [b]
- replicate :: Int -> a -> [a]
- unwords :: [String] -> String - 空白を挟んで連結
- head :: [a] -> a
- tail :: [a] -> [a]
- filter :: (a -> Bool) -> [a] -> [a]
- any :: (a -> Bool) -> [a] -> Bool - いずれかがTrue
- not :: Bool -> Bool
- (&&) :: Bool -> Bool -> Bool
- (||) :: Bool -> Bool -> Bool
- fst :: (a, b) -> a
- snd :: (a, b) -> b
- zip :: [a] -> [b] -> [(a, b)]
- unzip :: [(a, b)] -> ([a], [b])
- null :: [a] -> Bool
- (++) :: [a] -> [a] -> [a] - リストの連結
- show :: (Show a) => a -> String
- (.) :: (b -> c) -> (a -> b) -> (a -> c)
- catch x y - アクションx を評価中に入出力エラーが起きたら,y を評価する.
List の関数
- List.tails :: [a] -> a
- List.isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
- List.sort :: (Ord a) => [a] -> [a]
- List.group :: (Eq a) => [a] -> a
式
- do
- if 条件式 then 式1 else 式2
- let 定義1 定義2 in 式0
- $
- == - (==) :: a -> a -> Bool
- : - リストを作る
- リスト - [], [1, 2, 3], ["a", "b", "c"]
宣言
- import
- data
モジュール
- Main
- Prelude
- System
文法
- 関数名 引数1 引数2 引数3 ……
- 関数名 仮引数1 仮引数2 仮引数3 …… = 本体
- 結合性 優先順位 演算子 - infixl 2 <$$>
- 型宣言 - 変数1, 変数2, 変数3, ……, 変数n :: 型
パターンマッチ
関数名 第1引数のパターン 第2引数のパターン …… = 定義1 関数名 第1引数のパターン 第2引数のパターン …… = 定義2 関数名 第1引数のパターン 第2引数のパターン …… = 定義3
where 節
式 where 定義1 定義2 定義3 :
ガード
関数名 パターンA1 パターンA2 …… | ガードA1 = 定義A1 …… | ガードA2 = 定義A2 関数名 パターンB1 パターンB2 …… | ガードB1 = 定義B1 …… | ガードB2 = 定義B2
case 式
case 式 of パターンA | ガードA1 -> 式A1 | ガードA2 -> 式A2 : : パターンB | ガードB1 -> 式B1 | ガードB2 -> 式B2 : :
data 宣言
data 型コンストラクタ 型変数1 型変数2 …… = データコンストラクタA 型A1 型A2 …… | データコンストラクタB 型B1 型B2 …… | データコンストラクタC 型C1 型C2 …… :
type 宣言
type 型コンストラクタ 型変数1 型変数2 …… = 型
newtype 宣言
newtype 型コンストラクタ 型変数1 型変数2 …… = データコンストラクタ 型
class 宣言の例1
class Eq a where (==), (/=~ :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y)
class 宣言の例2(継承)
class (Eq a) => Ord a where compare :: a -> a -> Ordering (<), (<=), (>), (>=) :: a -> a -> Bool max, min :: a -> a -> a : -- クラスメソッドのデフォルトの実装
instance 宣言の例
data Anchor = A String String instance Eq Anchor where (A u l) == (A u' l') = (u == u') && (l == l')
モナド則
1. (return x) >>= f == f x 2. m >>= return == m 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)