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 mtlIO Action
Haskell でプログラミングするときに副作用があるような処理, あるいは外部に対して働きかけるような処理を書きたいときは アクションを使います.
なにも返さない場合は, () を返す.(トークンという)
Haskell では,モナドは
-
型構築子慣習的に, m と呼ばれている.
-
その型の値を構築する関数 (a -> m a), 慣習的に,return
-
その型の値とその型の値を生成する計算とを組合せて, その型の新しい計算を 生成する関数 (m a -> (a -> m b) -> m b) bind という. >>= とかく.
で表現されます.
- モナドの型構築子は計算の型を定義
- return 関数はこの計算の型のプリミティブな値を生成
-
= はこの型の計算を組み合わせる
この型のより複雑な計算を作り出します
-- モナド 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 におけるモナドの解説ページ:
- All About Monads
- Easy Monad
- Haskell の sequence 関数 - foldr をイメージして | すぐに忘れる脳みそのためのメモ
- Haskell の mapM_ – foldr と (>>) を意識して | すぐに忘れる脳みそのためのメモ
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 alexghc
Haskell コンパイラ.
% sudo pacman -S ghcghci
Haskell のコマンドラインインタプリタ.
# 起動
ghci test.hs
# 再読み込み
> :reloadcabal
パッケージマネージャー.
テスト
メジャーなものは以下
- doctest
- QuickCheck
- HSpec
- HUnit
doctest
コメントにテストを書くスタイルのツール.
Python の doctest を haskell に移植したものだとか.
QuickCheck
ランダムなテストデータによって関数の性質をテストする.
xUnit とは異なるコンセプトをもつ.
HSpec
xSpec ライクなテストツール.
Ruby の RSpec にインスパイヤされたらしい.
記法が BDD 的.
HUnit
xUnit ライクなテストツール. JUnit ライク.
- HUnit: A unit testing framework for Haskell | Hackage
- Haskell - HUnit 超入門 - Qiita
- Haskell の UnitTest, HUnit について学ぶ - エンジニアのソフトウェア的愛情
Install
$ cabal install HUnitUsage
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
- 🔧TidalCycles: live coding.
👴🏼Erik Meijer
アロハシャツの愉快な変なおじさん, Haskell Hacker.
Haskell 使い
- 🖊coursera で Principles of Reactive Programming を受けた | Futurismo
- 🖊Haskell で 関数型言語入門! edX の Introduction to Functinal Programming を受けた | Futurismo
- 📝Haskell
As a Facebook Developer
おそらくFacebookの社訓である📝The Hacker Wayに大きな影響を与えている.
Haskel with Emacs
わたしの記事が検索上位だと末法だな…
🔗References
Haskell を愛する若者たちへ
【翻訳】 Haskell を愛する若者たちへ | POSTD
人より知的で多くの知識を持っていると実感したいとか, また主流な言語に一石投じることで, 自分がニッチな言語に執着しているのは間違いではないという確証を得て安心したいのでしょうか?
Haskell を使うことでスマートなことができますが, だからといってこれが賢い人のための言語というわけではありません. この言語はシンプルさとスマートさを併せ持つ言語であり, 私たちは時にシンプルさを求め, 時にはスマートさを求めます. でも私たちは賢くあることに特別に重きを置いてはいません.