Haskell

Stackageにないパッケージをstackで使うまでの道のり

Haskellではコンパイラや(?)各種パッケージのバージョンの整合性問題で悩むことが多いので、Stackという仕組みをつかって、プロジェクトごとに、実行・作業環境を揃えるのがよいらしい yamlファイルというのを使う このStackだが、Stackで使いやすいよう…

再々再度のハスケル

Haskell。もう一度 データ型とか、そもそもの話はこの時期の記事群に、自分が知りたいことが書いてある。すべてはデータ型を定義して、そこから始まる、みたいな。 何か、仕事をしたくなったら、stackを使って、それ専用の環境を作り、パッケージなどもそれ…

Haskell 情報幾何 メモ

情報エントロピー Riemaniian manifold Riemannian manifold2 KLd and JSd Jacobian knn mcmc Probability density EMalgorithm EM2 Algorithmic Information Theory Stochastic memoization

米田の補題 メモ

米田の補題というのがある(Wiki) Wikiの冒頭文をそのまま書くと: 『米田の補題とは、小さなhom集合をもつ圏 C について、共変hom関手 hom(A, -) : C → Set から集合値関手 F : C → Set への自然変換と、集合である対象 F(A) の要素との間に一対一対応が存在…

atom で haskell シンタックスハイライト

atom のインストール(こちら) atom はパッケージ追加でカスタマイズ メニューの日本語化 Japanese-menu Haskellのシンタックスハイライト、とか language-haskell haskell-ghc-mod (こちらに色々書いてあるけれど、先にstack でハスケルを入れているのでパッ…

foldl (flip f) b [a]

foldl (flip f) b [a] という処理がよくわからなかった foldl にはfoldlかfoldl'かというような問題もあるようだが、ここでは、そんな(多分高級な)問題は関係なく、foldlの基本を確認する 関数 f として(-) 引き算を使う foldl (-) 10 [] -- 10:[]内に何もな…

Haskellでgtk+でプロット

ハスケルプでの統計的プロットはRでやることにするほうが良さそう(こちら) 以下のような混合正規乱数発生の場合は、Doubleのリストを作り、それのブランケット [] を外してタブ区切り文字列にして テキストファイルにする それをRから読み込んで hist() する…

Haskellでgtk+でプロット

ハスケルプログラムを実行して、ヒョイ、画面を立ち上げるようにしてプロットしたい ただし、プロットはRでやることにするほうが良さそう(こちら) ヒョイ、の仕組みとしてgtk+というのがある(こちら) 一応、マルチプラットフォームだそうだが、Windowsでは苦…

Haskellでドメイン固有言語

こちら(GADTとDSL)とこちら(確率的プログラミングとGADT/DSL)とHaskellのEDSL GADTs(Generalized Algebraic Data Types)は、Haskellのデータ型である代数型データタイプを一般化したもの これを使って、AST(abstract syntax tree)を作ることができる。このAS…

代数式、微分

math-functionsというのと、fad というのを入れるとできるらしい こちらがfadのページ stackするなら、 cabalのexecutable ...のbuild-depndsを build-depends: base , math-functions , fad || --yaml のextra-depsを >|| extra-deps: - math-functions-0.2…

Haskellの言語拡張

誰かが使っている、derivingによるクラス継承が、自分の環境では動かなかった 調べ物をしたら、どうも「誰か」は言語拡張を使って、クラス継承を暗黙的にできるようにしているらしかった その言語拡張は{-# LANGUAGE GeneralizedNewtypeDeriving #-}とハスケ…

記憶を引きずりながら進む確率過程

重い… sa :: Double sa = 0.4 sb :: Double sb = 0.3 g :: (Num a, Ord a ,Fractional a) => a -> a -> a -> a -> Double g x y z w | (x+1)/(x+y+2) > (z+1)/(z+w+2) = 1 | (x+1)/(x+y+2) < (z+1)/(z+w+2) = 0 | otherwise = 0.5 p :: (Num a, Ord a ,Fract…

Numeric.Probability を使う〜Haskellの確率的プログラミング

Haskellで確率密度分布を扱ってランダムサンプリングするときにモナドを使う、という話がある こちらの記事によると、それは遡ること2006年のこちらのペイパーとそれが作成したProbabilistic Fucntional Programming用パッケージが始まりだという。 その後、…

事前分布、事後分布、MCMC

事前分布は、パラメタに分布を仮定し、その尤度が計算できることとして決まる a,b,sdに一様分布を設定し、何か具体的な値に対して、その総合的な対数尤度をlogpriorが返す :{ let logprior :: Double -> Double -> Double -> Double;logprior a b sd = sum […

MCMCをやってみる

こちらのページをやってみる やるために、stackで環境を整える stack new hogeして、そのcabalファイルのmainの必要パッケージを以下のようにする executable pfptest-exe hs-source-dirs: app main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtso…

モナドを使うとは〜Haskellの確率的プログラミング

例えば、ベルヌーイ事象を繰り返して、その結果がどうなるか、というのをHaskellでやるとする ベルヌーイ事象の確率質量分布をモナドで作っていれば、2回繰り返しは、モナドを作って、それを>>=で次に渡して、もうひとつのモナドと合体させてモナドを作れば…

Hindley/Milner type systemとHaskell

延々とHaskellの勉強をしてきたけれど、その後でこれ(Functional Programming with Overloading and Higher-Order Polymorphism)を読むと、ああ、Type systemの勉強・Hindley/Milner type systemの勉強をしていたんだな、と解る が、Haskellの諸々の書き方を…

私のためのHaskell〜ひたすら原点回帰〜その4 Haskellで大きな仕事をする[], Functor, Monad は * -> *

意識される対象は、要素それ自体だったり、要素の連なりそれ自体だったりしたし 要素の集合を意識して、それを型と呼んだりした 関数は不特定の要素に定めた処理ルールであったが そのときの不特定要素というのは、型集合の要素であった 型そのものを要素と…

私のためのHaskell〜ひたすら原点回帰〜その3 関数の具体的な行為と抽象的な機能

値を2個取って値を返すことを考える。たとえば足し算 2+3 = 5 は、具体的な2と3を足して5を得る。この具体的な式で表されたものを「関数の具体的な行為」と呼ぶことにする x+y = z は、値xと値yとを足して値zを得る、という「この関数の抽象的な機能」を表…

私のためのHaskell〜ひたすら原点回帰〜その2 値・演算の階層構造、型・演算の階層構造

演算を拡張する 前の記事では、「あ」は型によって集合の要素となり、「あ」のうちの演算は値を取って値を返すものであったので、「型」を取って「型」を返す具体的な変化の集合でもあった 「○○を取って、××を返す」というメカニズムで「○○」と「××」は「型…

私のためのHaskell〜ひたすら原点回帰〜その1 値、演算、型

まだすらすらコードは書けないけれど、Haskellが実装しようとしていることと、それがどれくらいの徹底度で実装が進んできているのかのイメージはつかめた。 イントロ Haskellは(関数型言語として)、こういうことがやりたい、という『何か』のためにある 『何…

私のためのHaskell〜 [] リストを理解する その2

だんだんに性質を付与する リストには、Functorという型クラスの性質と、Applicativeという型クラスの性質とMonadという型クラスの性質が付与されていた。 この3つの型クラス、その性質はには順序がある。 Functor型クラスの性質が1番はじめで、次がApplic…

私のためのHaskell〜 [] リストを理解する

リストの手前と、リストの定義 Haskellの「大元」というのがある それをコンパイルしないと使えないので、コンパイラがあるが、GHCはそのひとつ GHCコンパイラは複数のモジュールファイルを持っていて、その定義がGHCによるコンパイルで使われる 基本的にはH…

基本〜私のためのHaskell〜総集編

Haskellの基本の基本を運用するにあたって設定されている仕組み〜これもプログラミング上は基本 型はグループ化される その1 型のそれぞれを要素とする型集合がある。特徴を共有する型を亜集合として取りまとめる。その亜集合を型クラス・クラスと呼ぶ。 そ…

基本の基本〜私のためのHaskell〜総集編

まとめるには、もう少し時間がかかる。。。 Haskellの基本の基本のき 原子のような要素とそれを関数で組み合わせたものとをひと塊として捉えている 型は整数型のような要素的なものもあり、それを足し算と掛け算のルールで複雑にしたものも型とする。代数的…

私のためのHaskell〜自作タイプだけで作る世界

はじめにMyType1なるタイプを定義する。deriving Showは表示を可能にするためのおまじない MyType1はAかBかの2つの実体を持つだけ MyType1だけがある世界でも関数は定義できる MyType2を加える。MyType1とMyType2とを行き来する関数が定義できる MyType3を…

私のためのHaskell〜その構成要素

Haskellのプログラムはタイプの連なり Haskellは、タイプの集合を持ち Haskellのプログラムはタイプの連なった構造として表現する。その構造の構成要素(構成タイプ)の数は1以上 プログラムの中で、タイプの直線的な連なり(紐)となるものは関数と呼ばれる。要…

Haskellをdesugarして覚えることを減らす

do記法はモナドのsugarだ、などと言われます do a b は a >> b こちらの書き方 do a <- hoge b <- hige a は a >>= b 違いは、">>"で繋がれている2つの処理は単に、2つを実行するだけで、a bの間でやりとりはないのに対し、a >>= bは、aの結果(の中身、モ…

Haskellを初めから

こちらがよいことに気づいた Stackを入れて、新しいプロジェクト "h170505"を作る 冒頭のサイトにも紹介されているOpenGLTutorial1をやってみる Main.hsの書き換え .../h170505/app/Main.hs を書き換える import Graphics.UI.GLUT main :: IO () main = do (…

乱数を使う

こちらのMain.hsを動かす import System.Random.MWC main :: IO () main = withSystemRandom . asGenIO $ \gen -> do -- 基本的な乱数生成 r0 <- uniform gen :: IO Int r1 <- uniform gen :: IO Double r2 <- uniform gen :: IO Bool print (r0, r1, r2) --…