タグ

ブックマーク / ruicc.hatenablog.jp (28)

  • Parametricity - think and error

    最近parametricityについてジャバを書きながらずっと考えていたのだけど、割と便利な結論が出てきたと思う。 任意の"デザインパターン"はparametricityを活用して構築出来る 継承を用いたデザインパターンはできないだろ、とか突っ込まれそうだけど実質同じ用途だったら同じとする。そこの差異に興味はない。 デザインパターンの定義はなんだよ、とかparametricityはなんだよとかも突っ込まれそうだけどまあそのうち。 論自体はまだまだ続くのだけど。例えば型クラス拡張版は簡単に導出できる。後はhigher-order-kindの型パラメータどうするかとか、Theorems for free!を基に考えてみるとか。あとプログラミングだけでなく一般の思考メソッドとしても用いることが出来る。 そのうちまとめてどこかで発表するかもしれない。 今まで設計に関する議論で気になってたことは、ド

    Parametricity - think and error
    ruicc
    ruicc 2015/11/25
    ジャバ書いてたら便利なこと思いついた話
  • think and error

    ScalaMatsuriのアンカンファレンスで人類の4分の1くらいが困っているであろう問題について話して来ました。 スライド2日でなんとか錬成したはいいけどストーリー的にあまりScala感がなくて悩んでました。そういえばHaskell以外の話をしたのは久しぶりな気がします。 この管理画面問題、みんなどうしてるのかなーと以前から疑問でしたが、軽く聞いてみたところみんな困っていそうということがわかりました(つまり未解決)。 どうでもいいですがslideshareが日語を表示しなくなった(そしてworkaroundめんどい)のでspeakerdeckに上げました。slideshare何が起こったの。 speakerdeck.com Q&A (うろ覚え+回答いくらか追加) Q1. OSSにしないの? するかもしれないですがやりたいことがまだ完成してないかつそれ入れると綺麗に切れるか微妙(ここで話

    think and error
    ruicc
    ruicc 2015/11/19
    test
  • 関数プログラミング交流会で発表した - think and error

    ブログに書くという行為を忘れがちな昨今。 9/13に関数プログラミング交流会があったので発表してきました。 http://connpass.com/event/16193/ 並行プログラミングと継続モナド from Kousuke Ruichi 関数プログラミングという題目のため、参加者はかなり広いと思われました。そのためわかり易い話題とわかり易い遷移を心がけつつコアな人にも何か持って帰るものがあるといいなーと作成しました。まあしかし発表時間の短さ故にかなり早口で喋ったため、置いて行かれたように感じた方もいたようです... twitterで質問がありましたが、スタックオーバーフローとかネタとしてはもう少しあったのですが流石に詰まりすぎかなと断念。並行プログラミングネタをもっと前面に押し出さないと題名負けかなーと思ったけどこれも色々あって断念。並行プログラミング関係なく継続モナドが便利なだけ

    関数プログラミング交流会で発表した - think and error
    ruicc
    ruicc 2015/11/04
    ブログ書くのを忘れてたので書いた
  • 函数型なんたらの集い2014でモナドについて話してきた - think and error

    函数型なんたらの集い 2014 in Tokyo - connpass 最近私的にモナドが非常に熱いのでそれについて話してきました。 しかし資料としては要改善点が多いですね... 図入れるとか具体的なコード入れるとか色々出来たのですけど。 Engineer-uses-monads from Ruicc Rail 例 具体例をスライドに入れられなかったため、trivialな例を示す。 おおまかな雰囲気は感じられると思う。 明記してないけど、純粋関数は任意のモナド内でモナドとは関係なく使えます。 -- Derivingに必要 {-# LANGUAGE GeneralizedNewtypeDeriving #-} import Control.Applicative (Applicative) import Control.Monad.IO.Class (liftIO, MonadIO) imp

    函数型なんたらの集い2014でモナドについて話してきた - think and error
    ruicc
    ruicc 2014/10/29
    Hello DSL的な簡単な例を載せました。 #haskell
  • GHCの末尾再帰最適化をCore上で確認してみる - think and error

    まず簡単に再帰関数(factorialとした)を、 非末尾再帰呼び出し(fac1) 末尾再帰呼び出し(fac2) で記述した。 fac1 0 = 1 fac1 n = n * fac1 (n-1) fac2 n = fac' 1 n fac' acc 0 = acc fac' acc n = fac' (acc*n) (n - 1) main = do print $ fac1 35 print $ fac2 35 まあこれはいいだろう。 そうしてSTGに渡す直前のCoreを見てみる(-ddump-prep) ghc -O1 -ddump-prep -ddump-simpl-stats main.hs > dump1OK.そうすると以下の用な関数が見える。main_fac1はfac1に、main_fac'はfac'にそれぞれ対応している。 ... snip ... Rec { Main.m

    GHCの末尾再帰最適化をCore上で確認してみる - think and error
    ruicc
    ruicc 2014/09/22
    TCOが気になったので少し調べた
  • OverloadedRecordFields is row polymorphism - think and error

    This is not explanation but raw log. I hope the world needs no more subtyping, and new languages have type class and row polymorphism:)

    OverloadedRecordFields is row polymorphism - think and error
    ruicc
    ruicc 2014/05/07
    残した
  • yesodとcabal sandbox - think and error

    2015-07-03追記: 現在yesodを使いたい場合は、stackを導入するのが適切だと思います。 https://github.com/commercialhaskell/stack cabal-install-1.18からsandbox機能が付き便利になったわけだが、いまいちyesodでsandbox機能をスマートに使う方法が見つからなかったのでメモ(というエントリを書いてからその方法が見つかると言うね。まあいいのだけど)。 なおGHC7.6.3, yesod-platform-1.2.7.1を前提としている。 どうでもいいがyesod-platform-1.2.6はyesod-bin-1.2.6で生成したファイル群で使えない悲しさがあった。そこバージョン合わせている訳じゃないのか。 yesod-platfromとは複雑な依存関係を持つyesodにおいてcabal-hellを回避す

    yesodとcabal sandbox - think and error
    ruicc
    ruicc 2014/02/19
    cabal sandboxを使いつつyesodプロジェクトを立ち上げる
  • SetはFunctorである - think and error

    Haskell Advent Calendar 2013 9日目です。 概要 SetはFunctor。 Categorical Programming for Data Types with Restricted Parametricity rmonad: Restricted monad library なぜSetはFunctorになっていないのか Setを要素が重複しないデータ構造とします。Setはその性質のため、要素には比較出来ることが要求されます。Haskellで言うとEq制約です。まあ来重複しないことだけを要求するならEq制約だけでいいはずですが、SetがOrd制約を要求しているのは効率の良い実装にするためでしょう。containersパッケージのData.Setはバランス二分木で実装されています。 来SetはFunctorにすることが出来るはずです。しかし現状(GHC7.6

    SetはFunctorである - think and error
    ruicc
    ruicc 2013/12/10
    Haskell Advent Calendar 2013、9日目です。
  • モナドが比喩で表せないことをわかりやすく説明したいモナドチュートリアル補足 - think and error

    厄介なのはjoinだ。joinは以下のような型を持つ。 join :: Monad m => m (m a) -> m a 読み下してみよう。「joinは、二重にネストしたモナド(m (m a))をとり、一つに潰して返す(m a)」。 モナドとは、このjoinによって決まる。 モナドの定義でreturn, (>>=)の対がよく出てくるが、(>>=)の代わりにjoinを使ってもいい。 (>>=)のjoinを用いた定義は以下だ。 (>>=) :: Monad m => m a -> (a -> m b) -> m b m >>= f = join $ fmap f m これも読んでみよう。「bind(>>=)は、(fmap f m)で生成されたネストされたモナド(m (m b))を、joinで潰した結果を返す」 つまりモナドの性質とは、このjoinの、モナドの潰し方によって決まる。 つまりモナ

    モナドが比喩で表せないことをわかりやすく説明したいモナドチュートリアル補足 - think and error
    ruicc
    ruicc 2013/06/29
    モナドチュートリアルではない
  • ゆるふわHaskell - think and error

    ゆるふわHaskell勉強会にてゆるふわなLTしてきました。 ゆるふわすぎましたね、Freeのあたりとか。 ゆるふわなHaskell話 from Ruicc Rail

    ゆるふわHaskell - think and error
    ruicc
    ruicc 2013/06/23
    ゆるふわHaskell勉強会でのLTスライドを上げました。
  • 静的型付言語/動的型付言語のメリット/デメリットについて考えてみる - think and error

    http://d.hatena.ne.jp/perlcodesample/20130227/1361928810 Haskellが好きな人です。 普段0.4M行くらいのPHPコードなんとかしてます。 Haskellerへ 変な事言ってないかチェックお願いします。 動的型付言語のトレードオフ 変数に型が無い事のトレードオフが理解出来ていないと思われる。 件のエントリを見ると、変数に型が付いていない方が圧倒的に有利に見える。そうだったら世の中のソフトウェアは全て動的型付言語を用いるはずだ、そうなっていないのは静的型付言語にもメリットがあるからだ、という論を僕はここではしたくはない。 彼が書いている部分でそのような論を用いている箇所が有る。大規模サイトで実際に動的型付言語を用いている、だから十分に使える(はずだ)という。ここは彼の自分の論(型が付いていない方が有利)から発生していない、少しずるい

    静的型付言語/動的型付言語のメリット/デメリットについて考えてみる - think and error
    ruicc
    ruicc 2013/03/03
    書いてしまった
  • dataToExpQ - think and error

    Haskell Advent Calendar 2012二日目です。 一日目から飛ばしてきましたね。負けずに頑張らなければなりませんね。 QuasiQuotes書くときにdataToExpQ便利ですよね。 便利だけどこんさんが何言っているかわかんねえ!という人向けの記事です。 間違ってたらツッコミください。 (以下ではGHC7.4.1を用いています) 何故QuasiQuotesなのか 僕らエンジニアが扱うものは基何らかのシンタックスに則って書かれています。 つまりHaskellerはConfigファイルやSQL文字列、もしくはある言語ファイルなどを目の前にして、 「このファイルパーズして"Haskellのデータ構造"として欲しいなあ」とつぶやく訳です。 文字列から値生成ならまだランタイムに出来ますが、型の生成や型クラスの生成などとなるとコンパイルタイムにやるしかありません。 というわけで

    dataToExpQ - think and error
    ruicc
    ruicc 2012/12/03
    Haskell Advent Calendar 2日目書きました。
  • HaskellでGPUプログラミングしてみた - think and error

    repa触ってみたらGPUも触ってみたくなったので触りました。 ライフゲームを略。 次の時刻の盤面を計算する部分です。ドキュメントやサンプルを見ると、どうやらstencilを使うと良いようです。 step :: Board -> Acc Board step arr = Acc.stencil stencil2D (Constant 0) . Acc.use $ arr cellとその周囲cellから次の時刻の値を計算出来るという、流体シミュレーションのために有るような関数ですね。 その際、境界条件をどうするかが第二引数です。 data Boundary a = Clamp | Mirror | Wrap | Constant a 最外値がその外もそのまま続いているかのように扱うのがClamp、範囲外の値が反転しているものがMirror、境界外が反対側と繋がっているものがWrap、定数値が

    HaskellでGPUプログラミングしてみた - think and error
    ruicc
    ruicc 2012/06/09
  • [Haskell]Haskellで文字列をevalするというかhintパッケージ - think and error

    http://hackage.haskell.org/package/hint-0.3.3.4 文字列からevalする感じのライブラリです。 GHCAPIのラッパーとも言います。 えーと。いや、使い方ずっと分かってなかったというか。 Preludeのimportが必要だったのだね.. import qualified Language.Haskell.Interpreter as I main = do line <- getLine result <- evalStr line case result of Right r -> print r Left er -> case er of I.UnknownError e -> putStrLn e I.WontCompile es -> mapM_ print es I.NotAllowed e -> putStrLn e I.GhcE

    [Haskell]Haskellで文字列をevalするというかhintパッケージ - think and error
    ruicc
    ruicc 2012/06/04
  • [haskell]OSX Lionでcabal install mysql - think and error

    メモ。 cabal install mysql(現最新は0.1.1.4)でエラーが出る。 ghc7.0.4。 じゃあと思って $ cabal install mysql-simple $ cabal install persistent-mysqlしてみたけどmysqlに依存してるぽい。 仕方ない。 $ cabal install --extra-lib-dirs=/usr/local/mysql/lib/ --extra-include-dirs=/usr/local/mysql/include/ mysql Resolving dependencies... [1 of 1] Compiling Main ( /var/folders/ym/jf63kw2n6453l1wq7s_186rr0000gn/T/mysql-0.1.1.423059/mysql-0.1.1.4/Setup.l

    [haskell]OSX Lionでcabal install mysql - think and error
    ruicc
    ruicc 2012/04/05
    haskellのmysql周辺て何故だかやる気なさそう
  • オブジェクト指向から理解する型クラス - think and error

    Haskell Advent Calendar2011 2日目です。 もう42時になってしまいました...さすがに遅いですね。 Haskellと言えば型クラス オブジェクト指向のクラスとHaskellの型クラスは違いますよ的な説明は見ますがどう違うか比べた情報が無い オブジェクト指向知っている人からの理解を簡単にすればHaskell理解する人が増えますね! という目論見の元にスライドを作りましたが、ユーザ視点が足りずに混乱させてしまったかも知れません。 Programming haskell chapter10 View more presentations from Ruicc Rail Haskell Advent Calendar明日はid:melponさんです。

    オブジェクト指向から理解する型クラス - think and error
    ruicc
    ruicc 2011/12/03
    Haskell Advent Calendar 2日目書きました。
  • 続・Template Haskell入門 -- QuasiQuotes編 - think and error

    先にこちらをどうぞ。Template Haskell入門 - think and error QuasiQuotesで簡単なものを作りましょう。 ここではヒアドキュメントを作ろうと思います。Haskellにはヒアドキュメントがないですから。 参考: こんさんのあれ:準クォートでもてかわゆるふわメタプログラミング! - はてな使ったら負けだと思っている deriving Haskell - haskell TemplateHaskellのあれ 前提: GHC7.2.1 そもそもTemplateHaskellで何が出来るのか 「既知の情報」と「ルール」をもとにHaskellのコードを生成するわけですね。 Haskellのコードで直接実現出来ないことや、似たようなコードを大量に書きたい時など便利そうです。 例えば可変引数関数(QuasiQuotesの例としてprintfが挙げられていますね)や、

    続・Template Haskell入門 -- QuasiQuotes編 - think and error
  • Haskellの関数合成でひっかかってたこと - think and error

    関数合成てのは f(g(x))こんなやつです。でもたまには次のようにやりたくなるわけですね。 h(x,y) = f(g(x,y)) Haskellでの関数合成は(.)です。これで上記をやろうとします。 -- 1引数関数 f x = x + 2 -- 2引数関数 g x y = x * y -- fとgを合成しようとする h = f . g -- hに2引数渡そうとする main = print $ h 3 5 -- => 17? これは型エラーがでます。 No instance for (Num (a0 -> a0)) arising from a use of `f' Possible fix: add an instance declaration for (Num (a0 -> a0)) In the first argument of `(.)', namely `f' In th

    Haskellの関数合成でひっかかってたこと - think and error
    ruicc
    ruicc 2011/10/05
    Haskellの高階関数関連で以前引っかかっていた部分。
  • HaskellでBTree書いてQuickCheckでテストしてみた - think and error

    Haskellが得意なことのひとつに木構造の操作がありますね。 ということでBTree書いてみました。 初め二分木書こうと思っていたんだけど、あまりにも簡単すぎたのでB木に変更。 そしたら思ったより難しくなってしまい。 参考:http://pfp7.cc.yamaguchi-u.ac.jp/~ichikawa/lecture/yamanashi-u/01/resume/node9.html selectとか木を走査するだけの関数ならパターンマッチ使って一瞬で書けるんだけど、insertはそれに加えてちょっと厄介な木の変更が行われるので、どんな関数書けば良いかわからず結構悩んだ。 具体的に言うと、B木のinsertは次数(以下ではnodeDegree)を超えるデータが一つのノードに挿入されると、そのノードを分解して「上(根方向)のノードに影響を及ぼす」。 ということでinsert'をなんとか

    HaskellでBTree書いてQuickCheckでテストしてみた - think and error
    ruicc
    ruicc 2011/09/26
    木構造扱えるとTemplate Haskellでも出来る幅が広がりますね。多分。
  • Enumでシーザー暗号、もしくは既知の型のインスタンス一部変更 - think and error

    Enumクラスのメソッドsucc, pred使うとシーザー暗号簡単に書けそうですよね。 succはsuccessorの略で、次に続く値を返してくれます。 数値の場合はインクリメントした値を返します。 predはpredesessorですね。数値ではデクリメントした値を返します。 caesarCipher' = map succ main = putStrLn $ caesarCipher' "abcde" -- => bcdef しかしsucc 'z'しても'a'にはなりません。 main = putStrLn $ caesarCipher' "zzzz" -- => {{{{{ では(succ 'z' == 'a')となってくれるようなCircularCharを定義すれば良さそうですね。 そうすればsuccで簡単にシーザー暗号書けるはずです。 newtype CircularChar =

    Enumでシーザー暗号、もしくは既知の型のインスタンス一部変更 - think and error
    ruicc
    ruicc 2011/09/17
    継承して一部オーバーライドで機能変更、と同じようなことを型クラスで行うのはちょっとコスト高いですよね。derivingで済むならいいけど。