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

IT練習ノート

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

最小のServantのサンプル(3)

A simple servant sample of error

最小のServantのサンプル(2)

A simple servant sample of Capture

最小のServantのサンプル

simple servant sample $ curl http://127.0.0.1:8081/myapi [{"name":"abc","id":1}]

HaskellでMySQLにアクセス

サンドボックスの作成 (root)foo:mysqlsample foo$ cabal sandbox init Writing a default package environment file to /Users/foo/work03/haskelldatabase/mysqlsample/cabal.sandbox.config Creating a new sandbox at /Users/foo/work03/haskelldatabase…

Mac, Haskell, OpenGLでサンプルを動かすまで(2017/02時点)

github.com このサンプルを動かそうとしたのですが、かなりハマったので、忘れないうちにメモを取ります。サンプルそのものの問題ではないです。 基本的な考え方 利用環境のOpenGLのバージョンを確認する。 support.apple.com GLSLのバージョンを確認する。 …

GLFWでwindowを表示するのサンプル

GLFWでwindowを表示するのサンプル(意外にも、単純なサンプルが検索しても見つけられなかった) the smallest GLFW sample

HaskellでOpenGLのサンプルを動かす

どうもGLUTは描画がメインで、GUIの操作はうまくできないらしく、GUI操作までやりたい場合はGLFWを使うようです(この点は理解があやふや)。ともかく動いたのでメモ。 サンプル ライブラリ OpenGLのライブラリ(Macではデフォルトで入っている??) GLFW - A…

明示的に型を指定するVisible Type Application

GHC 8.0からVisible Type Applicationが導入されました。 TypeApplication – GHC 今までは::で型を明示的に指定していました。 Prelude> Prelude> let x = return 1 Prelude> :t x x :: (Num a, Monad m) => m a Prelude> let x = return 1 :: Maybe Int Pre…

IntとIntegerの違い

IntとIntegerとの違い インスタンスの確認 Prelude > :i Int data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‘GHC.Types’ instance Bounded Int -- Defined in ‘GHC.Enum’ instance Enum Int -- Defined in ‘GHC.Enum’ instance Eq Int -- Defined in…

Servantのexampleのcabalファイルを作成する

下記にあるexampleのgreet.hs用のcabalファイルを作ります。 github.com cabal initにて対話形式で必要な項目を入力していきます。 foo$ cabal init Package name? [default: servant02] greet Package version? [default: 0.1.0.0] Please choose a license…

Servantのログ出力

@lotz さんの下記の記事があります。手元で動かそうとしたところ(2017/01/15時点)、記事が書かれた頃とライブラリのバージョンが変わっているため、そのままでは動作しませんでした。そこで、修正部分をメモしました。 qiita.com 修正のポイントは以下の2点…

Control.Monad.Logger

Log出力したいだけなのにさっぱりわからず。下記は動作するけどコーディングの考え方が間違っているはず。LoggingTはMonadXXXXのインスタンスになっているのに、なんでliftが必要なのかも謎。Haskellの独学は厳しい。。。。 Control.Monad.Logger Monad Logg…

Poserset by filterM

stackoverflow.com Deducing code from types: filterMbyorgey.wordpress.com Powerset by filterM

Monadic parsing in Haskell

Monadic parsing in Haskell Monadic parsing_in_Haskell

all sorts of permutations (insertion sort)

all sorts of permutations (insertion sort)

HaskellのMonoidの情報

Monoid全般 Monoid応用 FizzBuzz itchyny.hatenablog.com Diagrams Diagrams - Diagrams Quick Start Tutorial Finger tree

map, map, liftM

> :t map map :: (a -> b) -> [a] -> [b] > :t fmap fmap :: Functor f => (a -> b) -> f a -> f b > :t liftM liftM :: Monad m => (a1 -> r) -> m a1 -> m r > :t (<*>) . pure (<*>) . pure :: Applicative f => (a -> b) -> f a -> f b > map (+1) [1,2,…

waiでのrequestの処理

waiでrequestの基本的な使い方を確認するサンプル。 wai_hello.hs wai_index.html *Main> main start app function ==================================== requestMethod : GET secure : False rawPathInfo : /cgi.php rawQueryString : ?foo=1111 requestHe…

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

monadのfail関数の型は、fail :: Monad m => String -> m aとなっていて、それぞれのモナド毎に異なる挙動となる。 fail function of monad

3分でHaskellのWebアプリ

のサンプルを動かします。但し、待ち時間を除きます。 Beginning Haskell - A Project-Based Approach | Alejandro Serrano Mena | ApressのWebアプリの説明では、フレームワークとしてscottyを使っているので、導入してみました。 バージョンの確認 webapp …

Data types à la carte の写経

直和型を構成するところがわからなかったので写経してみました。 論文のコードと異なるところは Functorはderivingした 適宜showを実装した Exprにデストラクタoutを追加 Free Monadの構成のところで、Applicativeを追加した(ただし、Applicativeの実装はわ…

型だけでReaderモナドを理解しようと試みる

Reader Monad は 昔 Environment Monad と呼ばれていたそうです。 Control.Monad.Reader ということで(!?)、設定ファイルを使う体で例を作ってみました。 設定ファイルを使わないと、 doJob123' = \x -> doJob3' x $ doJob2' x $ doJob1' x () となります。…

JavaでReaderモナドを理解してみる

Readerモナドはdependency Injectionとして理解してみると良いかもしれません。 slides.com Java開発で言えば、Web開発でよくDependency Injectionがでてきます。例えば、フレームワークにSpringをつかうと、こんな感じでしょうか。 package hello; import o…

構造を保つ関数の比較

map > :t map map :: (a -> b) -> [a] -> [b] fmap > :t fmap fmap :: Functor f => (a -> b) -> f a -> f b traverse > :t traverse traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) mapM > :t mapM mapM :: (Traversable t, …

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…