覚書

概念はわかっても,用語が慣れないのでその辺をリストしたい.

用語

  • アクション (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)