FreeStyleWiki

Haskellの文法覚え書き

このエントリーをはてなブックマークに追加

[Haskell]

Haskellの文法覚え書き

  Haskellのデバッグ

printデバッグ的なことができるようだ

import Debug.Trace

...


-- trace :: String -> a -> a 
-- traceはStringと何か(a)を受け取って(a)を返す

-- この後 name が評価されないとデバッグログが出ない。なんとかならんのかこれ…
name = trace ("name: -> " ++ show ( lang opts )) ( lang opts )

-- List形式の場合は
[trace ("comprehending " ++ show x) (x + 1) | x <- [1..10]]

-- 使い方としてはwhere句にて
...
where
  xs = [trace ("comprehending " ++ show x) (x + 1) | x <- [1..10]]

-- とかやるといい感じにデバッグできる

  Haskellのモジュール

Module の定義は、モジュール名、エクスポートするシンボルのリスト(exp-list) を書き、

その後に where をおいて本体を書きます。

exp-list が省略されたときは、本体で定義された すべてのデータ型、関数が エクスポートされます。Module 名は必ず大文字で始めます。

一般に、ソースファイル1つにつき Module 1つを書き、Module 名とファイル名を一致させます。

  Haskellで使われる記号

気になったもの。。Perlよりわかりにくい。

「.」
ピリオド、パイプ、関数の合成。(わかりにくすぎる…) ScalaだとandThenとかcomposeにあたるもの
「:」
コロン。コンス。リスト型コンストラクタ。(わかりにくすぎる…) Rubyとかだと[]にあたるものか
「<-」
束縛、バインド(IOアクション)(わかりにくすぎる…、パターンマッチの矢印とは関係がない) Goで言うところの := とか <- にあたるものか
「@」
as。アズパターン。[email protected](l:ls)とか。 ???

  型制約

Haskellの型上には、データ型や型コンストラクタの他にも、型制約という登場人物がいます。

型制約は名前の通り、型の制約が書けるようにするものです。以下の関数をみてください:

minByOrd :: Ord a => a -> a -> a
minByOrd x y = if x < y then x else y

この関数minByOrdは、型aが順序を持つ(Ordクラスのインスタンスである)という制約を満たしている時、

二つの引数のうち小さい方をOrdのメソッド<を使用して返します。

concatMap

concatMapはリストの各要素に関数fを適用したものをconcatする.例えば,

Prelude> putStr $ concatMap (++"\n") ["These", "are", "multiple", "lines"]
These
are
multiple
lines

  分岐の記述

  • Haskellにはいろいろな条件分岐の記述方法がある、要素的には
    • パターンマッチング
    • ガード文
      • 加えて、その中でよく使われる文法でMaybeモナドというものが存在する

パターンマッチング

  • 中括弧 "{" , "}" は省略可能
  • セミコロン ";" , ";" も省略可能
    • 複数行の処理を書くときとかは書かなければコンパイルが通らなかったように思う
case 式 of {
    パターン1 -> 式1 ;
    ... ;
    パターンn -> 式n ;
}
  • パターンマッチングは式の計算結果を結果として返すので、以下のように書くことが可能
nankaMojiretsu = case 式 of {
    パターン1 -> "あれこれ" ;
    パターンn -> "なんか書いとけ" ;
}
  • MaybeモナドはJavaやScalaのOption型やOpt型と同じようなもの(というか元ネタ)であり
    • Maybeで宣言された型にはJust xという形でなにか値が存在するか、Nothingになっているか二択の状態である

パターンマッチングは以下のように、Maybeモナドを剥がして中身を取ることが出来る。

  case 何かMaybeで宣言された変数 of
    Nothing -> 何かする ;
    Just x  -> x        ;  -- x はMaybeの中身

ガード文

  • 以下のような形で、パターンマッチにガード文をつけることが可能
absMaybe x =
  case x of
    Nothing            -> 0
    Just x | x < 0     -> -x   -- Just x にマッチし,x < 0 のとき
           | otherwise -> x    -- Just x にマッチし,x < 0 でないとき

関数定義自体にガード文をつけて、多態的なこともできる

参考にしたサイト

  部分適用