読者です 読者をやめる 読者になる 読者になる

IT練習ノート

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

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…

Haskellで初めてのHttp通信

Httpクライアント処理を書いてみました。 import Network.HTTP.Conduit import qualified Data.ByteString.Lazy.Char8 as BS main :: IO () main = do res <- simpleHttp "http://www.example.com/" putStr $ BS.unpack resp コンパイルをします。 [ec2-user…

Yesodのインストールと立ち上げ

Amazon Linux AMI 2013.09.2にて試してみました。 嵌ったところ ec2-userでhaskellやYesodをインストールしましたが、permissionエラーになる箇所があり(具体的な場所は忘れてしまいました)、ルートユーザでインストールした方が良さそうです。 [ec2-user@…

AWSにhaskell環境構築

Haskell開発環境構築 vimでコーディングがしやすいようにプラグインを入れてみる。毎度のことながら嵌りましたねぇ。 感想などなど cabal等を使っているものの、各種モジュールの依存関係で手こずる。 各種インストールはblog等のweb情報を参考にしつつも、…

Amazon Linux AMI にhaskellインストール

haskellのライブラリをいろいろインストールして試行錯誤したいと思ったので、wasのEC2上にHaskellをインストールしました。ただ、インストール自体で試行錯誤しました。。cabelがインストールできず成功はしてないとおもいますが、とりあえず動きました。た…

Data.ListのByつき関数

Data.ListにはByつき関数がありますが、ないものとあるものを並べてみました。対応関係としては、 Eq a が a -> a -> Bool Ord a が a -> a -> Ordering となっています。 関数 型 Byつき関数 型 nub Eq a => [a] -> [a] nubBy (a -> a -> Bool) -> [a] -> […

Haskellのコードを左から読むとき右から読むとき

-- 合成関数の場合、右から読む。 Prelude> ( (+1) . (*3) ) 4 13 Prelude> -- Control.Arrowを使ってみる -- >>>は左から読む。シェルのパイプをつなげるように。 Prelude> :m Control.Arrow Prelude Control.Arrow> ( (+1) >>> (*3) ) 4 15 -- <<<は右から…

Haskellでの集合演算は簡単だけどpreludeの場合少し嵌る

http://hackage.haskell.org/package/base-4.6.0.1/docs/Data-List.html の "Set" operations を参照しました。 -- 和 Prelude> Data.List.union [1,2,3] [3,4,5] [1,2,3,4,5] -- 積 Prelude> Data.List.intersect [1,2,3] [3,4,5] [3] -- 差 Prelude> Data.…

99 questions/Solutions/31の回答の作り方(よくない例)

試行錯誤の履歴です。もっとうまい試行錯誤の方法があるはず。。 -- 2から10までの配列を作る Prelude> ( \x -> [2..x] ) 10 [2,3,4,5,6,7,8,9,10] -- 作った配列に対して、なんらかの関数を適用してみる。 -- filterを使うつもりだが、まずは結果が分かりや…

再帰でのletとinが読み熟せない

99 problems 20より別解として下記が示されていました。 removeAt :: Int -> [a] -> (Maybe a, [a]) removeAt _ [] = (Nothing, []) removeAt 1 (x:xs) = (Just x, xs) removeAt k (x:xs) = let (a, r) = removeAt (k - 1) xs in (a, x:r) 再帰しているので…

Haskellの2種類の割り算

-- 割り算結果は小数部分込み Prelude> 7 / 2 3.5 Prelude> :t 7 / 2 7 / 2 :: Fractional a => a --割り算結果は整数扱い Prelude> 7 `div` 2 3 Prelude> :t 7 `div` 2 7 `div` 2 :: Integral a => a -- drop の第一引数の型は int のため下記はエラーとな…

haskellの型推論わからん

99 problemsのquestion 9の回答をみたら、span関数がありました。http://www.haskell.org/hoogle/?hoogle=span Prelude> :t span span :: (a -> Bool) -> [a] -> ([a], [a]) 第一引数は関数なので、適当にidを渡してみたところ、こうなりました。 Prelude> :…

関数適用は最優先 (99 questions problem 8 より)

回答は、下記なのですが、理解に苦しみました。 compress :: Eq a => [a] -> [a] compress = map head . group mapを使ってリストの要素に対してhead . group をする意味が分かりませんでした。 map head . group [1,1,2,2,3] とあったときにリストの要素0番…

モナドが消える

99 questions の6問目の別解が難しい。 Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,1] True Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,4] False Prelude> となっています。次のように型を確認すると、 (1) Prelude> :t Control…

99 questions problem 3

リストの要素を1始まりで取得する関数の作成で、NG場合。 *Main> last $ take 1 ['a','b','c','d','e'] 'a' *Main> last $ take 2 ['a','b','c','d','e'] 'b' *Main> last $ take 3 ['a','b','c','d','e'] 'c' *Main> last $ take 4 ['a','b','c','d','e'] '…

関数適用は最優先

下記のコンパイルエラーには嵌りました。 *Main> let foo xs = last .init sx <interactive>:326:25: Not in scope: `sx' Perhaps you meant `xs' (line 326) *Main> これは、 last . (init sx) と解釈されているからでしょう。関数合成してる部分を括弧に囲むとエラーに</interactive>…

const id

const id は第2引数を返します。その理由がわかりませんでした。 *Main> :t const id const id :: b -> a -> a *Main> const id 1 2 2 理由を説明した Webページをいくつか読みましたが、それでも理解できず(x_x;)。 基本に立ち返ると、次の2つを理解して…

すごいH本7章の概要

7章 型や型クラスを自分でつくろう7.1 新しいデータ型を定義する dataキーワードの紹介 7.2 形づくる データ型定義の具体例を示す。 Circle(円)とRectangle(矩形)からなるShape型の作成。 Shape型の面積を求める関数を作成する。 Point型を作成し、上記のSh…