tags: 🔖ProgLang

Haskell

純粋関数型言語.

文法

標準ライブラリ

分からないときは, Hoogle で調べる. source タブを押せば定義が見れる.

すごい Haskell を楽しく学ぼうがオンラインで無料で読める.

少し古い 98 仕様

基礎がまとまっている.

List

Prelude> head[1,2,3,4,5]
1
Prelude> tail [1,2,3,4,5]
[2,3,4,5]
Prelude> [1,2,3,4,5] !! 2
3
Prelude> take 3 [1,2,3,4,5]
[1,2,3]
Prelude> drop 3 [1,2,3,4,5]
[4,5]
Prelude> length [1,2,3,4,5]
5
Prelude> sum [1,2,3,4,5]
15
Prelude> [1,2,3] ++ [4,5]
[1,2,3,4,5]
Prelude> reverse[1,2,3,4,5]
[5,4,3,2,1]

Monad

cabal update
cabal install mtl

IO Action

Haskell でプログラミングするときに副作用があるような処理, あるいは外部に対して働きかけるような処理を書きたいときは アクションを使います.

なにも返さない場合は, () を返す.(トークンという)

Haskell では,モナドは

  1. 型構築子慣習的に, m と呼ばれている.

  2. その型の値を構築する関数 (a -> m a), 慣習的に,return

  3. その型の値とその型の値を生成する計算とを組合せて, その型の新しい計算を 生成する関数 (m a -> (a -> m b) -> m b) bind という. >>= とかく.

    で表現されます.

    1. モナドの型構築子は計算の型を定義
    2. return 関数はこの計算の型のプリミティブな値を生成
    3. = はこの型の計算を組み合わせる

    この型のより複雑な計算を作り出します

    -- モナド m の型
    data m a = ...
     
    -- return はモナドのインスタンスを作る型構築子
    return :: a -> m a
     
    -- bind はモナドのインスタンス m a と,
    -- a から別のモナドのインスタンス m b を作る計算と
    -- を組み合わせて新しいモナドのインスタンス m b を作る
    (>>=) :: m a -> (a -> m b) -> m b

do 記法

main = do
  s <- getLine
  print s
  • <- 演算子で, 値に IO の結果を 束縛 (bind) できる.
  • Haskell を不浄にする魔法たち - Google スライド

    do ブロックは通常の関数と異なるのでアクションと呼ばれます. do ブロックから外部に値を返すには return を用います. return a とすると外部には IO a が返ります

    do ブロックの結果は do ブロックの最後のアクションの結果となります. return で do ブロックの結果 (アクション) を外部に返すことができます.

    IO a を a に換えるには, do ブロックの中で <- を使います

Bookmarks

Ruby での解説:

Haskell におけるモナドの解説ページ:

edX のページ:

Tips

n+k Pattern

  • を文中で利用するには, ソースに以下を入れる.
{-# LANGUAGE NPlusKPatterns #-}

or

$ ghci -XNPlusKPatterns

ツール

Haskell Platform

Haskell 開発用の環境.

ArchLinux には, haskell platform がない??

AUR の haskell-platform を利用するのではなくて以下をここにインストールするのがよいと, Arch Wiki には書いてある.

  • ghc (ghc) - The compiler
  • cabal-install (cabal-install) - A command line interface for Cabal and Hackage
  • haddock (haddock) - Tools for generating documentation
  • happy (happy) - Parser generator
  • alex (alex) - Lexical analyzer generator
% sudo pacman -S ghc cabal-install haddock happy alex

ghc

Haskell コンパイラ.

% sudo pacman -S ghc

ghci

Haskell のコマンドラインインタプリタ.

# 起動
ghci test.hs
 
# 再読み込み
> :reload

cabal

パッケージマネージャー.

The Haskell Cabal | Overview

テスト

メジャーなものは以下

  • doctest
  • QuickCheck
  • HSpec
  • HUnit

doctest

コメントにテストを書くスタイルのツール.

Python の doctest を haskell に移植したものだとか.

QuickCheck

ランダムなテストデータによって関数の性質をテストする.

xUnit とは異なるコンセプトをもつ.

HSpec

xSpec ライクなテストツール.

Ruby の RSpec にインスパイヤされたらしい.

記法が BDD 的.

HUnit

xUnit ライクなテストツール. JUnit ライク.

Install

$ cabal install HUnit

Usage

Test.HUnit をインポート.

import Test.HUnit

テスト対象コード

import Data.List
import Data.Char
import Unsafe.Coerce
 
data Nat = Zero
         | Succ Nat
         deriving Show
 
natToInteger (Succ n) = natToInteger n + 1
natToInteger Zero = 0

テストコード

記法は以下.

tests = TestList
        [ "natToInteger 1" ~: natToInteger Zero ~?= 0
        , "natToInteger 2" ~: natToInteger (Succ Zero) ~?= 1
        , "natToInteger 3" ~: natToInteger (Succ (Succ Zero)) ~?= 2
        ]
 
h = tests

テスト実行

runTestTT (テスト関数名) でテスト実行.

$ runTestTT tests
Cases: 3  Tried: 3  Errors: 0  Failures: 0
Counts {cases = 3, tried = 3, errors = 0, failures = 0}

わざと失敗させてみる.

*Main> runTestTT tests
### Failure in: 2:natToInteger 3
expected: 1
 but got: 2
Cases: 3  Tried: 3  Errors: 0  Failures: 1
Counts {cases = 3, tried = 3, errors = 0, failures = 1}

Tips

独自に型を定義したときは, Eq を継承する.

data Nat = Zero
         | Succ Nat
         deriving (Show, Eq)

Topics

👴🏼Erik Meijer

アロハシャツの愉快な変なおじさん, Haskell Hacker.

Haskell 使い

As a Facebook Developer

おそらくFacebookの社訓である📝The Hacker Wayに大きな影響を与えている.

Haskel with Emacs

わたしの記事が検索上位だと末法だな…

🔗References

Haskell を愛する若者たちへ

【翻訳】 Haskell を愛する若者たちへ | POSTD

人より知的で多くの知識を持っていると実感したいとか, また主流な言語に一石投じることで, 自分がニッチな言語に執着しているのは間違いではないという確証を得て安心したいのでしょうか?

Haskell を使うことでスマートなことができますが, だからといってこれが賢い人のための言語というわけではありません. この言語はシンプルさとスマートさを併せ持つ言語であり, 私たちは時にシンプルさを求め, 時にはスマートさを求めます. でも私たちは賢くあることに特別に重きを置いてはいません.