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で使われる記号

  型制約

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