Create  Edit  Diff  TrashSUITE  Index  Search  Changes  RSS  Source  Login

Haskell :: memo

Hello World

main = putStrLn "Oppai Futomomo Pantie OK!!"
-- > Oppai Futomomo Pantie OK!! 
  • putStrLn 関数は,文字列リテラルを引数に取り,文字列に改行コードを付与して出力するアクションを返す
  • putStrLn 関数を,文字列リテラル "Oppai Futomomo Pantie OK!!" に適用(apply)
  • 変数 main を,アクションに束縛(bind)
  • エントリポイントは main 変数(アクション)
  • 実行すると main が評価され,"Oppai Futomomo Pantie OK!!\n" を出力

オフサイドルール

main = do cs <- getContents
          putStr cs
-- > % echo 'Oppai' | runghc do.hs
-- > Oppai
  • ABC や Python 等のように,インデントが構文として意味を持つ
  • do 式は,インデントでまとめられた複数のアクションを上から下へ逐次評価するブロック的なアレ

リスト

[1, 2, 3, 4]               -- valid
["Hello", "Oppai"]         -- valid
['o', 'p', 'p', 'a', 'i']  -- valid
[1, 2, "oppai"]            -- invalid
  • リストはデータの単方向リンクリストで,空リストで終端する
  • 複数の型を同じリストに含めることはできない
  • リストリテラルは [1, 2, 3] と記述でき,終端の空リストは明示しない
  • 文字列は,内部的には文字のリスト [Char](String) である

$ 演算子

main = do cs <- getContents
          print $ length $ lines cs
-- > % runghc wcl.hs < /etc/passwd
-- > 65
  • $ は二項演算子の一つで,関数の後に書くとそれ以降の式が全て引数として扱われる性質を持つ
  • print(length(lines cs)) と等価
  • lines 関数は,文字列を改行コードで分割したリストを返す
  • length 関数はリストの長さを返す
  • print 関数は値を文字列化して標準出力へ吐き出すアクションを返す

関数定義

functionName arg1 arg2 = logic
  • arg1, arg2 という二つの引数を取る functionName 関数の定義

パターンマッチ

main = print $ fact 10 -- > 3628800

fact 0 = 1
fact n = n * fact (n - 1)
  • オーバーロードの概念に似ている
  • 引数が異なる同名関数を定義順に探索し,マッチした時点で適用する
  • マッチした定義以降は適用されない
  • 上記の場合,fact 0 と fact n の定義順が逆であれば,再帰し続けスタックオーバーフローとなる

ワイルドカード

main = print $ sumList [1,2,3,4,5] -- > 15

sumList (x:xs) = x + sumList xs
sumList _      = 0 
  • 引数を _ と定義すると,渡された引数に関わらずマッチする
  • 変数の束縛は生じない
  • 上記の場合,[] は (x:xs) にマッチしないので,sumList _ へ落ちて 0 が返る
  • switch case における default のように使えて便利

局所変数,シャドウ

lets = let x = 1
           y = 2
       in [x, y]

shadow = let x = 1
         in [(let x = 2 in x), x]

main = do print lets   -- > [1,2]
          print shadow -- > [2,1]
  • 局所変数は let ブロックで定義する
  • 定義した変数は,let ブロック内および in に続く式の中で使用できる
  • let がネストし,同名変数が存在する場合,内側の変数が外側の変数を隠蔽(シャドウ)する
  • ghc にオプション -fwarn-name-shadowing を付けるとシャドウの検出・警告をおこなう
Last modified:2009/10/04 13:41:07
Keyword(s):
References: