北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

haskell

自由モナドの定義であるところの Control.Monad.Free.Church.foldF

圏論勉強会の資料 によれば、 と自由な構成 について、 を与えると が得られるとある。 自由モナドの文脈でこれを考えると、関手 からモナド (の構造を忘れて関手と思ったもの)への自然変換を定義すれば、自由モナド からモナド への自然変換(正確にはモナド…

monadiusを動かす

12年前に書かれた http://www.geocities.jp/takascience/haskell/monadius_ja.html を手元で動かした。と言っても、ほぼ手を加えずにそのまま動いた。 $ diff -ur monadius.BK/ monadius diff -ur monadius.BK/src/Main.hs monadius/src/Main.hs --- monadiu…

shu-thing (シューティングもどき) を動かす

12年前にhaskellで書かれた shu-thing を手元で動かした。と言っても、ほとんど何もせずに動いてしまった。 @@ -10,6 +10,7 @@ import System.Process main = do + getArgsAndInitialize keystate <- newIORef [] cp <- newIORef (openingProc keystate) ini…

Server::Starter を利用できるサーバの実装

http://qiita.com/hiratara/items/2dacf8470c378b130d5c に書いたとおり。 下回りが苦手なので色々調べたのだけど、今回もGREEの https://github.com/gree/haskell-prefork なるリポジトリが役に立った。 fork するだけじゃんと思って中を読むと、環境変数仕…

Windows 上での getChar のための no-buffering-workaround パッケージ

hiratara.hatenadiary.jp エンターキーを押さないとキー入力を受け付けてくれない。大昔からチケットが上がっていて、 今日気がついたのだけど、Hackageにいい感じのパッケージが上がってる。 no-buffering-workaround: Workaround for GHC bug #2189. 使い…

ConnectionFailure getAddrInfo: does not exist (Name or service not known) が出た

vagrantで ubuntu/zesty64 を使ったら、 https://github.com/commercialhaskell/stack/issues/2536 的なメッセージが出てかなりの高確率で stack setup に失敗した。 そもそも安定版使ってないほうが悪かったので、 ubuntu/xenial64 使うようにしたら収まっ…

stackのコードを読む

stackのコードを読んでるのでメモ。まだ全然肝心なところに入ってない。 パーサーでコマンドライン引数をパースして、パースの結果として得られる関数を実行する作り optparse-applicativeをフォークして使っている なんの処理を加えてるのかは読んでない 例…

Data.List.(\\)

(\\) という演算子 *1 でリストの差を取れるのだけど、こいつは最初の出現しか削除してくれない。というのを知らなくて、バグった。 Prelude> import Data.List Prelude Data.List> [1, 2, 2, 3, 3, 1] \\ [1, 2, 3] [2,3,1] 複数引くとその個数だけ消える。…

式と型と値

JavaもHaskellも静的型付けの言語だけど、Javaをやっている人とHaskellをやっている人で、「静的型付け」という言葉で頭に描くイメージはだいぶ違うと思う。 じゃあどう違うのかってのを説明すると小難しい話になりがちなのだけど、Haskell 2010 Language Re…

ghcと文字コードとWindowsと

ghc さんは、エラーメッセージに ascii の範囲外の文字を平気で使ってくる。これ、環境によってはハマるので勘弁して欲しい。具体的にはWindowsなんだけど。 例えばこんなメッセージ。 Prelude> 3 / 4 :: Int <interactive>:1:1: error: • No instance for (Fractional In</interactive>…

入門Haskell(10年前の本)

久々に入門Haskellのsamegameを作る章を読んだ。本を買った当時は頭に入ってこなくて流し読みしかしなかった記憶があるけど、今読むと書いてあることはシンプルだった。 この本に問題があるわけではなく10年前の本なので当たり前だけど、なんだかなあと思う…

tls周りが遅くて悲しい

昨日のプログラム のプロファイリング取った。 ... tlsManagerSettings Network.HTTP.Client.TLS 51910 0 0.0 0.0 87.7 92.5 mkManagerSettings Network.HTTP.Client.TLS 51911 0 0.0 0.0 87.7 92.5 ... decodeLenient Data.ByteString.Base64.Lazy 55231 0 …

ストーカー、始めました

冬休みの工作。 lotz84さんが https://github.com/lotz84/haskell/ のHaskellのブックマークをガンガン更新していて、これはいいものだと思ったのでストーカーするバッチを書いた。 soozy.slack.com *1 の #haskell というほとんど誰も使っていない部屋に更…

ResourceTのコードリーディング

雑に読んだメモ。だいたい構造わかったので満足。 Readerモナドを自前で定義している 開放用のアクションを登録するマップを保持 RefCount は fork 用のリファレンスカウント、 NextKey はリリースに必要なキーの採番用 前者は minBound から加算、 後者は m…

lambdabot-hipchat-plugins

HipChatを使う機会があったので、lambdabotをHipChatへ組み込むプラグインを書いてる。とりあえず年内ぎりぎりでなんとなくは動くようになった。以下、この件に関するメモ。 HipChatのAPI WEB APIとXMPPが使える。メッセージのストリーミングはXMPPを使うこ…

関手圏からHaskへの関手

こんな感じでいいのかな。 class HFunctor hf where hfmap :: (Functor f, Functor f') => (forall t . f t -> f' t) -> hf f -> hf f' 以下は、型bを固定した時に定義できる関手F_bで、Functor fを型f bに移すような関手の定義。 data FunctorB b g = Funct…

I/Oストリーミングライブラリの実装の基礎 - 後編

前回の続きである。予告通り、2つのストリーミングの「出力」と「入力」をつなげる処理、そして、ストリームの命令列を解釈する処理系を実装する。 2つのストリームを1つにする(考え方) 「出力」と「入力」をどうくっつけるといいのか。それぞれのストリーム…

I/Oストリーミングライブラリの実装の基礎 - 前編

conduitやpipesなどのストリーミングライブラリの実装は結構わかりにくい。Pipes to Conduitsという一連のエントリが分かりやすい解説なのだが、それでも序盤からFunctorやFreeモナドを駆使していてハードルが高めな印象を受ける。理解するには自分で実装す…

今日は第一回 ゆるふわHaskell入門会の日です

第一回 ゆるふわHaskell入門会に来ています。Hackathonがメインですが、トークもボチボチありますのでメモります。 究極の手続き型言語Haskell / @fumieval さん 関数型言語とは 関数を自在に操作、組み合わせて記述 手続き型とは 手続きを自在に組み合わせ…

自由マグマを自由対象の定義の図で書くと

圏論勉強会 第3回の自由対象で悲鳴が上がってたようなので、参考までに図に書いて説明しておく。まず、マグマと自由マグマを以下のように定義する(というか、勉強会においてこう定義していた)。 class Magma a where magappend :: a -> a -> a data FreeMagm…

fmap head VS sequence

sequenceを使えば、複数個あるモナド値を1つのモナド値に集められる。 xs :: (Functor m, Monad m) => m [()] xs = sequence [return x' | x' <- [(),()..]] xsはモナドに包まったリストなので、fmapを使ってheadを持ち上げれば先頭要素がとれる。 x :: (Fun…

今日はekmett勉強会の日です

ekmett勉強会に来ています。ekmettさんがオンライン参加されています。 I love profunctors. They're so easy / liyanghuさん 傘を指し棒に使うと言う斬新なプレゼン。詳細はこちら。 HaskellのFunctorは共変 Predicate (a -> Bool) は Functor ではない (半…

Parsecのソースちら見(1)〜(3)

Parsecのソース読んでQiitaにメモった。 Parsecのソースちら見 Parsecのソースちら見(2) Parsecのソースちら見(3) 最初に全体構造さえ掴めれば比較的読みやすい内容。 let ... in がhaskellにしては多いのかなと思ったのだけど*1、もしかすると作ってるのOCa…

Stateモナドとオブジェクト

面白くもなんともないParsonオブジェクト。 package Parson; sub new { my ($class, $self) = @_; bless $self => $class; } sub change_name { my ($self, $name) = @_; $self->{name} = $name; } sub get_name { my ($self) = @_; $self->{name}; } my $p …

命令型言語Haskell

※これはHaskell Advent Calendar 2012の12/12分の記事です。こんにちわ、Perlのプログラマの@hirataraです。関数型言語はまともに使ったことがないので、命令型言語の話を書きます。

MonoidもMonadもモノイドだって話

わかめのモナド浸しと第6回 スタートHaskell2で「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」という話をしてきた。スライドは以下。 モナモナ言うモナド入門 *1 モナモナ言うモナド入門.tar.gz .tar.gz の方はHaskellでの説明だ…

今日は第2回スタートHaskell の日です

第2回スタートHaskellに来ていますので、レポートします。といっても、中身は全てProgramming in Haskell の話なのですが。 宿題の解説 / @yuzutechnology さん 宿題の答え合わせ。 問題2 : カリー化の問題。 問題3 : フレームレートやビットレートの計算。 …

図でわかる(?)モナド おまけ: 図からコードを書く

最後に出した例ですが、 module Main where main :: IO () main = getLine >>= putStrLn . reverse モナドで悟りをひらきたいのなら - 図でわかる(?)モナド さきほどのエントリの図が全部わかれば、以下のような図も書けますね。reverseをfmapで持ち上げて橋…

モナドで悟りをひらきたいのなら - 図でわかる(?)モナド

圏論の最大の武器はダイアグラムなので、モナドで悟りをひらきたいのならダイアグラムを使えばいいんじゃないでしょうか。 ダイアグラムの書き方 例えば、「 f :: a -> b 」とか「length :: [a] -> Int」は以下のように書きます。型を点で、関数を矢印で書き…

次の難関は・・・?

モナドがわかれば終わるほどHaskellの世界は甘くないわけです。次の難関はモナドの合成・・・Stateモナドの世界からIOモナドの世界行ったりするのは大変だよねって話です。うん、確かに大変。以下のURLを参考にお勉強でしょうかねえ。 モナドの合成は難しい …

Stateモナドを今度こそ理解する(3)

さらに前回の続きです。これで最後。Stateモナドにおける >>= の説明と、関数的なイメージを解説したつもりなのですが・・・。うーん、こりゃあ説明の仕方がとてもよくないですね(汗。解説に関して、もっとわかりやすいようにリベンジした方がいいかもしれま…

Stateモナドを今度こそ理解する(2)

前回の続きです。2回で終われませんでしたorz今回は、Stateモナドの値の説明と、returnの定義です。モナド=Stateモナドとか、モナド=IOモナドなどと思うのは危険です。「Stateモナドは、モナドインタフェースの実装例」くらいに解釈するのがいいと思います。

Stateモナドを今度こそ理解する

3年前に理解しようとして惨敗した*1HaskellのStateモナドの解説に、リベンジしようと思います。圏論をちょっとはかじったので、今度こそまともな解説ができるはず。と言うことで、今回は前編です。圏論の知識は前提とはしてないですが、集合と写像にアレルギ…

SICPの進捗

まだここです。英語読めねー( ̄。 ̄;) 。

Square Roots by Newton's Method

進展が遅くて、まだこのページ読んでます( ̄ェ ̄;) 。こんな実装で平方根が求められるのに感動。中毒的な面白さがありますねー。

"モンダ"

モナドと打とうとしてtypoですorz。数学的には、こちらが定義を解説してくれていてわかりやすかったです。もっとプログラミングよりの解説もあります。perl使いのためにDanさんも解説してくれているのですが、こちらは超越し過ぎていてオレの頭では理解でき…

単なるしおり(3)

明日はここから。 p = pとしてpを評価すると、無限ループに陥るのは、当たり前のことではあるけど、関数言語と手続き言語の違いをよく表している気がしました(・へ・;;)。

単なるしおり(2)

明日はここから。normal-orderとapplicative-orderが出てきた。*1 *1:すっかりHaskellじゃなくなってきた(笑)。

単なるしおり

今日の一時間が終了。明日はここから。

SICPが流行ってますねー

Haskell入門が終わったので、流行に便乗して読んでみようかなと思います。で、日本語訳の評判が余りに悪いので原文で・・・。英語の技術書を読む練習にもいいかなと。 【俺ルール】 1日1時間を毎日 ページ数は気にしない。なるべくわからないところを作ら…

MonadStateのgetって?

StateモナドはMonadStateになってまして、getとかputとか持ってるわけです。で、getすると状態が取れてput sすると状態がセットできる。 myCounter = do n <- get put $ n + 1 return $ n + 1 doCount3 = do myCounter myCounter myCounter countResult = ev…

Stateモナドの意味を想像する

Stateモナドのお勉強。なんとなくモナドの正体が見えたような。ただし、半分予測を含む理解なので正当性は保証しないです。後、実際の使用方法は全然気にしてなくて、意味だけ考えてます。*1Stateモナドを理解するために頭の中に用意するのはa、bの集合(型)…

モナドの壁

やっぱり壁でした( ´△`)アァ-。数学的に理解するには、こちらの説明が手がかりになりそうですが、なんとも、圏論なんて真面目にやってなかったし、そもそも代数なんて完全に忘れてます。嗚呼無力なオレ。数学的じゃない理解だと、Monad mってコンテナにデー…

hugs meets intelMac

finkでhugs入れました。使い勝手はghciと一緒って感じです*1。開発してる訳じゃなくて勉強中、 かつ、 intelMacな人は、ghcの次のバージョンが出るまではhugs使うと幸せになれます。 *1:Data.Charのimportは無理でしたが。ghc独自ライブラリかしらん?

たぶん誤り

入門Haskell?はじめて学ぶ関数型言語向井 淳 自分メモ。 P107 下部の図の二分木は2が頂点じゃないかと。 P108 BinTree型がいつのまにかTree型に。 P112 foldl insertTree emptyTree はfoldrだと思った これからやっとモナドに入れます。

型宣言、型クラス、データコンストラクタ、型コンストラクタ、インスタンス

むずい(笑)。とりあえず一通り読まないとわからなさそう。 import Data.Char data MyType = I Int | F Float | C Char myTypeToInt :: MyType -> Int myTypeToInt (I m) = m myTypeToInt (F m) = truncate m myTypeToInt (C m) = ord m mySum :: [MyType] ->…

リストが難しい

Haskellがとっても面白い。やってることはほとんどパズルですけど(笑)。リストの演算子がかなり混乱しました。(:) :: a -> [a] -> [a]。つまり、x:xsは、x aって型にしたければ、xs:xって記述となる。ややこしー。

Haskellの初コード

splitAtを書いてみろとのことなので、挑戦。勘でwhere節を書いたら一発で動いて一安心*1。 mySplitAt :: Int -> [a] -> ([a], [a]) mySplitAt 0 x = ([], x) mySplitAt _ [] = ([], []) mySplitAt n (x:xs) = (x:a, b) where (a,b) = mySplitAt (n-1) xsなん…

Haskellの日本語本

まともな日本語本が出てなかったHaskellに、ついに日本語本が出ました。 入門Haskell?はじめて学ぶ関数型言語向井 淳 そんなわけで英語本を買うのを踏みとどまって、YAPCで宣伝(?)してたHaskellの日本語本をゲット。これから遊び勉強を始めます。楽しく遊び…