IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Haskell

Beginning Haskell A Project-Based Approachはお勧め?

「すごいHaskellたのしく学ぼう!」https://www.amazon.co.jp/dp/B009RO80XY/と並行して、Beginning Haskell A Project-Based Approachを読んでみようかと思いました。 www.apress.com が、誤記が多いらしく、お勧めできないようです。

Type Classのメモ

Type Classは以下の4つの観点から理解するとよい。 観点 (1) インターフェースが定められている。 (2) 満たすべき法則(law)がある。 (3) 上記を満たすインスタンスがある(抽象化の逆の具体化されたもの)。 (4) インターフェース以外に便利な操作(Operation)…

monad transformers step by step

2016/11時点monad transformers step by stepをgoogleで検索すると、本家ではない情報が先に出てくるようです。 こちらが先に出てくるようですが、 https://page.mi.fu-berlin.de/scravy/realworldhaskell/materialien/monad-transformers-step-by-step.pdf …

The Extended Functor Family

www.youtube.com class position terminology intuition application Functor positive covariant full of a's applicative alternative Contravariant negative contravariant consuming a's divisible decidable discrimination Produnctor left negative …

foldlとfoldrの違い

foldl 手続き型言語のループの代わり foldr コンストラクタの置き換え foldr -- 型の確認 Prelude> :t foldr foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b -- リストのコンストラクタを適用 Prelude> :t foldr (:) [] foldr (:) [] :: Foldable t…

inits, tails を紙で確認

inits tails

Constantのファンクタ則を例を使って確認

インポート *Main> import Data.Functor.Constant 型の確認 *Main Data.Functor.Constant> :t Constant Constant :: a -> Constant a b *Main Data.Functor.Constant> Constant 1 Constant 1 *Main Data.Functor.Constant> let x = Constant 1 *Main Data.Fu…

ファイル読み込みでのモナドを使っている感じ

do記法でのファイル読み込み import System.IO printFile :: String -> IO() printFile path = do handle <- openFile path ReadMode contents <- hGetContents handle putStrLn contents hClose handle 型を確認する。 > :t openFile openFile :: FilePath …

PipesでHelloWorld

PipesでHelloWorld Prelude Pipes P> runEffect $ (yield "Hello World" ) >-> P.stdoutLn Hello World Producerの型 Prelude Pipes P> :t (yield "Hello Wordl") (yield "Hello Wordl") :: Monad m => Proxy x' x () [Char] m () Consumerの型 Prelude Pipe…

Haskellでgithubに公開されているパッケージを取得してサンドボックスで実行するまで

ポーカーゲームを例にしてGithubからパッケージを取得して実行するまでの手順をまとめる。 github.com 作業ディレクトリを作る。 aaa:work03 foo$ mkdir poker aaa:work03 foo$ cd poker gitからパッケージを取得する。 aaa:poker foo$ git clone https://gi…

関数をn回適用する

foldr (.) id (replicate n f) を理解したい。 stackoverflow.com *Main> :t foldr (.) の型を考える。 *Main> :t foldr foldr :: (a -> b -> b) -> b -> [a] -> b 置き換えておく。 foldr :: (x -> y -> y) -> y -> [x] -> y *Main> :t (.) (.) :: (b -> c)…

const id

constとconst idの違い Prelude> const 'a' 1 'a' -- 第1引数を返す Prelude> (const id) 'a' 1 1 -- 第2引数を返す 型の確認 const idは第2引数を返すことがわかる。 Prelude> :t const id const id :: b -> a -> a 型の計算 Prelude> :t const const :: a …

fmap f = bind (return . f)

fmap f = bind (return . f)を確認する。 まず、定義の確認 fmap :: (a -> b) -> (W a -> W b) --- {*4} fmap f (W x) = W (f x) --- {*1} return :: a -> W a --- {*6} return x = W x --- {*3} bind :: (a -> W b) -> (W a -> W b) --- {*7} bind f (W x) …

HaskellのEitherとeither

Eitherという型がありますが、eitherという関数もあります。 Either型 Data.Either Prelude> :i Either data Either a b = Left a | Right b -- Defined in `Data.Either' instance (Eq a, Eq b) => Eq (Either a b) -- Defined in `Data.Either' instance M…

Haskellで例外処理の初歩

import System.Environment (getArgs) import Control.Exception (catch, SomeException) main :: IO () main = do args <- getArgs out <- catch (readFile $ head args ) (\_ -> return "error") print out test$ runghc test02.hs test02.hs1 test02.hs:1…

Haskellでコマンドライン実行で引数をとる

getArgsを使う import System.Environment (getArgs) main :: IO () main = do args <- getArgs print args test$ runghc test02.hs [] test$ runghc test02.hs a ["a"] test$ runghc test02.hs a b ["a","b"] test$ runghc test02.hs ab ["ab"] test$ rungh…

最大回避ヒープ

参考 FOP - 第1章 二分ヒープ木の楽しみ data (Ord a) => Tree a = Null | Fork Int a (Tree a) (Tree a)みたいにdata定義で型の制約が出来ないみたいですね。 data Tree a = Null | Fork Int a (Tree a) (Tree a) deriving (Show) isEmpty :: (Ord a) => T…

エラトステネスの篩

エラトステネスの篩を実装してみる。 まずは100までで試してみる。 余りがゼロの数を取り除く。 *Main> filter (\x -> mod x 2 /= 0)[2..100] [3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,7…

HaskellでChurch Pairsの練習

Church Pairsとはウィキペディアを参照すると: Church encoding - Wikipedia, the free encyclopedia となっています。これをHaskellで書き下すと: Prelude> let pair = \x -> \y -> \z -> z x y これを、使ってみると: Prelude> pair 4 5 (+) 9 Prelude …

Stateモナドの定義の理解

Stateモナドの定義を確認します。 Control.Monad.State.Lazy newtype State s a = State { runState :: s -> (a, s) } なんで、 s->(a, s)という形なのかずっと疑問でした。 ... 次のように考えるとよいかと思いました。 まず、b -> aという計算を考えるとし…

Monadのfail関数について思ったこと

Monadのチュートリアルでほとんど語られることがないfailについて確認します。 Monadの情報を確認すると: Prelude> :i Control.Monad Top level: Failed to load interface for `Control' Use -v to see a list of the files searched for. Prelude> :i Mon…

関数が第一級の対象であることの感覚とは?(2)

Stateモナド,Writerモナド,Readerモナドは、型の中に関数が「隠れている」感じがします。 どのような関数が型の中に「隠れている」かを見抜くことがポイントなのかなぁと思っています。 もっと単純な(役に立たない)コードで示すと: test15.hs: data AB = …

Javaの感覚、Haskellの感覚

Javaやっていて、Haskellを学んでいると、なにか原落ちしない感覚、違和感のある感覚があり、それがうまく言葉に表せないことが多々あります。 こういうところが、腹落ちしてなかったのだなぁと感じたことのメモ。 データ構造としてMapはどの言語でも使いま…

関数が第一級の対象であることの感覚とは?

多分こんな感じではないかと思っています。 通常は関数を定義して、それに値を与えます。例えばこんな感じ: Prelude> let f1 = \x -> x * 2 Prelude> :t f1 f1 :: Integer -> Integer Prelude> f1 4 8 Prelude> 関数が第一級のクラスであるとは、関数の引数…

Haskellで最小値と最大値を同時に(one pass)求める

モノイドを学習をしているときに、モノイドのインスタンスがあれば、複数のモノイドを同時に計算ができて、スゲーなと思いました。じゃあ、minとmaxのモノイドを作れば同時に求めることができるだろうと思って試行錯誤したことがあります。こちらのエントリ…

Stateモナドのモジュール名

Lazyの有無に関係ないようですね。 Prelude> :i Control.Monad.State.State type Control.Monad.Trans.State.Lazy.State s = Control.Monad.Trans.State.Lazy.StateT s Data.Functor.Identity.Identity -- Defined in `Control.Monad.Trans.State.Lazy' http…

haskellのインストール

悲しいことにAWS上に作っていたHaskell環境のインスタンスを誤ってTerminateしてしまいました。 なので、再度環境を作成しました。 環境はamzn-ami-pv-2014.03.2.x86_64-ebs (ami-25dd9324)です。 コマンドのログは下記です。 yum update yum install gcc yu…

haskellでのバイナリデータの書き出し その2

バイナリデータの扱いを例として、モナドの使い方の練習を引き続き行っています。 work03$ ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking .…

Monadの練習

Int型の数値の確認 Prelude> 1 1 Prelude> :t 1 1 :: Num a => a Int型の配列の型の確認 Prelude> :t [1] [1] :: Num t => [t] Maybe Int型の型の確認 Prelude> :t Just 1 Just 1 :: Num a => Maybe a returnしたときの型の確認 このでは何のMonadであるかは…

Haskellでバイナリの書き出し

まずは、型の確認。 Prelude> :t Data.ByteString.Lazy.putStr Data.ByteString.Lazy.putStr :: Data.ByteString.Lazy.Internal.ByteString -> IO () Prelude> :t Data.Binary.Put.runPut Data.Binary.Put.runPut :: Data.Binary.Put.Put -> Data.ByteString…

haskellのlookAheadの練習

BinaryパッケージにlookAhead関数があります。 https://hackage.haskell.org/package/binary-0.5.0.2/docs/src/Data-Binary-Get.html#lookAhead Prelude> :t Data.Binary.Get.lookAhead Data.Binary.Get.lookAhead :: Data.Binary.Get.Get a -> Data.Binary.…

バイナリデータ読み込み

Read a bite from a binary file Prelude> :l test01.hs [1 of 1] Compiling Main ( test01.hs, interpreted ) Ok, modules loaded: Main. *Main> test_binary Loading package array-0.4.0.1 ... linking ... done. Loading package deepseq-1.3.0.1 ... li…

様々なsplitAt

HoogleでのsplitAt検索結果 http://www.haskell.org/hoogle/?hoogle=splitAt 比べてみると理解が深まりますね。 配列 Prelude> :t splitAt splitAt :: Int -> [a] -> ([a], [a]) Prelude> splitAt 5 "abcdefghijklmnopqrstuvwxyz" ("abcde","fghijklmnopqrst…

Monads for functional programmingの写経(3)

Log Monad Log Monad

Monads for functional programmingの写経(2)

State Monadの写経をしてみました。 実際に計算をしていると、状態というよりs->(x, s)という関数をずっと使い回しているイメージでした。 State Monad ふぅ。計算に疲れました。。。

Monads for functional programmingの写経

Monads for functional programmingを教材(http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf)として例外処理の写経をしてみました。実際写経してみると、この例外処理の例題は、Eitherそのものに思えてきました。 Exception Monado …

Haskellでニム和、ニム積の実装

ニムとは http://en.wikipedia.org/wiki/Nimber ニム和、ニム積の実装をHaskellで書いてみました。 100%そのままではないにしろ、数式をそのままコードに置き換えることができたのではないでしょうか。 無限リストや内包表記の使い方の学習にもなりました。 …

コンパイル時に型推論が効かない例

下記のように対話的なコードを書いてみました。コンパイルエラーとなりました。 [work06]$ cat test07.hs import System.IO main :: IO () main = do putStrLn "Waht is your name?" a <- readLn putStrLn "How old are you?" b <- readLn return () [work06…

IOでの対話環境(ghci)とプログラム実行(runghc)の差異

環境によって挙動が異なります。ghciにて小さなコード片を試してから、プログラムを書くことが多いので、このような差異は頭の片隅においておいた方が良さそうです。 プログラム実行(runghc) バッファされるので、コーディング上先にあるputChar 'a'がgetCha…

Haskellでの数当てゲームでのIO遅延

(05/08追記)コメントを参照してください。 数当てゲームを作ってみました。 doブロック中で出力と入力が交互に処理されるロジックを書いたつもりですが、そうはなりませんでした。遅延評価によると思うのですが、解決方法がわかりませんでした。根本的なとこ…

ラムダ式で部分適用?

部分的用途とか、ラムダ式とかghci上で、小さなコードをいろいろ試していたらだんだんわからなくなりました。 min関数はパラメータを2つ取ります。Integer型の5を部分適用して、5と比較して小さい値をとる関数を作ります。 Prelude> :t min min :: Ord a =>…

ラムダ式を使うときと使わないときの型推論の差

よくわかっていない。。。 ラムダ式の場合は型がInteger Prelude> let a = \x -> x * 2 Prelude> :t a a :: Integer -> Integer Prelude> a 5 10 Prelude> a 1.2 <interactive>:4:3: No instance for (Fractional Integer) arising from the literal `1.2' Possible fix: </interactive>…

PPMのライブラリを使ってみる

モジュールの確認 [work04]$ cabal list | grep PPM Warning: The package list for 'hackage.haskell.org' is 34 days old. Run 'cabal update' to get the latest list of available packages. * AC-PPM Synopsis: Trivial package for writing PPM images…

haskellでppmファイルをネガポジ変換

まぁ目も当てられないHaskellコーディングです。 自分がHaskellわかっていないことを晒していますね(^^;;。画像フォーマットのデータ構造をデータ型として表現すべきなのはもちろんですが。。 1 import System.Environment 2 import qualified Data.ByteStri…

cabelを使ってgithubにあるパッケージをインストール

練習してみました。 step.1 ダウンロードする [work04]$ wget https://hackage.haskell.org/package/ppm-2009.5.13/ppm-2009.5.13.tar.gz --2014-04-21 11:13:51-- https://hackage.haskell.org/package/ppm-2009.5.13/ppm-2009.5.13.tar.gz hackage.haskell…

HaskellでIntからCharへの変換

その(1) Prelude> :t Data.Char.chr Data.Char.chr :: Int -> Char Prelude> Data.Char.chr 70 'F' Prelude> Data.Char.chr 102 'f' その(2) Prelude> :t Data.Binary.Put.putWord8 Data.Binary.Put.putWord8 :: GHC.Word.Word8 -> Data.Binary.Put.Put Prel…

遅延評価に嵌る

お約束中のお約束と思います。 バイト列の読み込み サイズが196623バイトのファイルがありまして。 [testuser]$ ls -al ./girl.ppm -rw-r--r-- 1 testuser testuser 196623 4月 20 06:54 ./girl.ppm ghciを起動して。 [testuser]$ ghci GHCi, version 7.6.3:…

バイナリデータの書き出し

意外にもシンプルなサンプルが見つけられなかったのでメモ。 というかこれであってるのかなぁ。。 import System.IO import qualified Data.ByteString.Lazy as BL import Data.Binary.Put main :: IO () main = do whandle <- openFile "foo_out2.txt" Writ…

headを試してみる

headという関数を試してみました。 事前準備 StringをByteStringにする方法は、Hoogleで検索すると、Data.ByteString,Char8.packでした。 Prelude> :t Data.ByteString.Char8.pack Data.ByteString.Char8.pack :: String -> Data.ByteString.Internal.ByteSt…

FFIの練習 Haskellからcを使う

HaskellにはFFIという仕組みがあり、他言語とバインディングできるようです。言語の枠組みとしては、cだけでなくc++,Javaも視野に入っているようです。 Chapter 8 Foreign Function Interface http://www.haskell.org/onlinereport/haskell2010/haskellch8.h…