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 を䜿うこずでスマヌトなこずができたすが, だからずいっおこれが賢い人のための蚀語ずいうわけではありたせん. この蚀語はシンプルさずスマヌトさを䜵せ持぀蚀語であり, 私たちは時にシンプルさを求め, 時にはスマヌトさを求めたす. でも私たちは賢くあるこずに特別に重きを眮いおはいたせん.