タグ

haskellに関するkanbayashiのブックマーク (26)

  • Javaで無限リスト - がくぞーのメモ

    Haskell の勉強をしていたら iterate という関数を見つけて非常に興味がわきました。 iterate は「初期値」と「現在の値から次の値を算出する関数」の二引数を与えると無限リストを生成してくれる関数です。 線形合同法を用いた疑似乱数列なども簡単に作れてしまうようですね。 線形合同法 - はてな使ったら負けだと思っている deriving Haskell - haskell 線形合同法 - 結城浩のHaskell日記 - haskell 無限リストは遅延評価の言語ならではだよなー、Javaだと無理だよなーとかぼんやり考えていたんですが、もしかして hasNext() が常に true を返す Iterator って無限リストとして使えるのでは?と思いたったので書いてみました。 前提として以下のような interface が存在するとして、 public interface Fu

    Javaで無限リスト - がくぞーのメモ
  • 遅延評価とIO - あどけない話

    僕は今、プログラマーとしての幸福感に満たされている。遅延評価を習得できたと思えるからだ。 遅延評価 なぜ関数プログラミングは重要かには、遅延評価の利点を以下のように説明している。 停止条件はループの体とは切離すことができ、強力なモジュール化が可能となる。 例として載っている「ニュートン-ラプソン法による平方根」は、若干難しいので、簡単な別例を示そう。Haskell には、第一引数の数だけ、第二引数を繰り返す関数 replicate がある。 > replicate 3 'a' → "aaa" これを普通に実装するとこうなる。 replicate 0 c = [] replicate n c = c : replicate (n-1) c Haskell 以外で実装する場合、きっとループを使うだろう。ただ、ここでは再帰かループかは問題ではない。 問題は、「結果を作る仕事」と「終了条件を判断

    遅延評価とIO - あどけない話
  • GHCiデバッガ

    GHCiは単純な命令的スタイルのデバッガを搭載していて、実行中の計算を停めて変数の値を確かめることができる。このデバッガはGHCiに統合されており、デフォルトで有効になっている。デバッグ機能を使うのにフラグは必要ない。一つ、重要な制限があって、ブレークポイントとステップ実行は解釈実行されているモジュールでしか使えない。コンパイル済みコードはデバッガからは見えない[5]。 このデバッガは以下のものを提供する。 プログラム中の関数定義や式にブレークポイントを設定する能力。その関数が呼ばれたとき、あるいはその式が評価されたとき、GHCiは実行を中断してプロンプトに戻る。そこで、実行を続ける前に、局所変数の値を調べることができる。 ステップ実行ができる。評価器は、簡約をだいたい一回行うごとに実行を一時停止し、局所変数を調べることができるようにする。これはプログラムのあらゆる地点にブレークポイントを

  • Haskellでもデバッグプリントしたい + Sコンビネータの練習 - 趣味的にっき

    いきなりですが、やっぱりHaskellでもデバッグプリントしたいですよね。調べた結果、Debug.Traceにある関数traceを使えばできることがわかりました。おお、副作用が… 実装はきっと暗黒面なんだろうな(キレイな身体じゃ生きられない、みたいな)。 そのまま使ってもいいんですが、せっかくなんでRubyっぽく関数pを定義してみました。 ファイル: a.hs module Main (main) where import Debug.Trace (trace) p :: (Show a) => a -> a p = p' "" p' :: (Show a) => String -> a -> a p' s a = trace (s ++ show a) a inc :: Int -> Int inc i = i + 1 main :: IO () main = print $ p $ i

    Haskellでもデバッグプリントしたい + Sコンビネータの練習 - 趣味的にっき
  • basic data types in Haskell

    4. 型 Haskell は Lisp や Python と違って強く型付けされた 言語です。Haskell の型はかなり複雑です。 目次 真偽値、文字、数値 tuple 関数の型 List タグ付き型 class と instance 1. 真偽値、文字、数値 まず、真偽値、数値、文字などの要素的な型について 述べます。 以下の表に要素的な型の一覧を示します。 名称 説明

  • Common Mistakes

    kanbayashi
    kanbayashi 2011/12/31
    正にこの"Numbers"の内容にハマっていた
  • 檜山正幸のキマイラ飼育記 - 世界で一番か二番くらいにやさしい「モナド入門」

    気まぐれと偶然となりゆきで、ここ2,3回はモナドを話題にしました。googleで「モナド」を引いてザッと眺めると、「モナドはむずかしいー」とか「モナドで挫折した」みたいな雰囲気が感じられて、説明芸人の血が少し騒ぎましたね。「なら、予備知識ゼロでモナドの説明をしてやろうじゃねーか」と。 タイトルはだいぶ煽っちゃった…… けど、ハッタリじゃないつもり…… けど、実際はどうかな? ※印刷のときはサイドバーが消えます。 内容: とりあえず、あたりさわりなくモナドの来歴を紹介する こんな課題を考えてみよう:副作用付き計算 カウントアップする関数達 カウントアップしたい意志を戻り値で伝える それでは、いったい誰がカウントアップをするのだ 関数の引数の型をCountup型にまで拡張する そして、これがモナドだ とりあえず、あたりさわりなくモナドの来歴を紹介する 今からここで説明する「モナド(monad)

    檜山正幸のキマイラ飼育記 - 世界で一番か二番くらいにやさしい「モナド入門」
  • モナドで悟りをひらきたいのなら - 図でわかる(?)モナド - Pixel Pedals of Tomakomai

    圏論の最大の武器はダイアグラムなので、モナドで悟りをひらきたいのならダイアグラムを使えばいいんじゃないでしょうか。 ダイアグラムの書き方 例えば、「 f :: a -> b 」とか「length :: [a] -> Int」は以下のように書きます。型を点で、関数を矢印で書きます。 ダイアグラムの利点は、fやlengthの中身を忘れて簡略化することができることです。人間の脳ができることには限りがあるので、注目する情報が少ない方が理解しやすくなるってスンポーです。 なお、 合成 g . f は図示する時に順が逆になるので気をつけて下さい。これは、合成関数の適用が g ( f x ) と書けることに由来してます。まずfを適用し、次にgを適用するということです。 return と >>= の図示 今回のダイアグラムの約束として、元となる型(Bool, Char, Int 等)は最下段に書きます。そ

    モナドで悟りをひらきたいのなら - 図でわかる(?)モナド - Pixel Pedals of Tomakomai
  • Codelogy: Haskell でバグの出にくいプログラミング (2)

  • Haskellと副作用 - あどけない話

    よく、Haskellには副作用がないと言われるが、それは間違いだ。確かに、Haskell には状態の変化(あるいは再代入)という副作用はない。しかし、入出力という副作用はある。この記事では、Haskell の副作用に対して、命令型プログラマーにすっきりと理解できる説明を試みたいと思う。 間違った方向への第一歩 Haskell の副作用に関する典型的な説明は、こんな感じだ。 Haskell にはあらゆるレベルで副作用がない。そのため、遅延評価が可能になる。遅延評価では、コードが記述順に実行/評価されるとは限らないので、入出力と相性が悪い。そこで、IO モナドが導入されている。IO モナドのおかげで、入出力に関するコードは記述順に実行され、外界に作用できる。 この説明を聞いて理解しろという方が無理である。説明が苦しい最大の理由は、Haskell にはあらゆるレベルで副作用がないと、間違った一歩

    Haskellと副作用 - あどけない話
  • Readerモナドを試してみる - みずぴー日記

    30分プログラム、その663。Readerモナドを試してみました。 The Reader monadを読んでたら、環境がどうのこうの書いてあったので、簡単なプログラミング言語を作ってみました。環境が使いたかっただけなので、変数束縛と変数参照のほかには、整数リテラルと加算演算子ぐらいしかありません。 前に読んだHaskellの入門書には「複数の関数で引数を共有したいときはReaderモナドを使うといいよー」と書いてあったけど、微妙に違う気がする。共有できるのは引数一個だけだし、共有してる変数を書き換えることもできるし。 使い方 *Main> runEval $ Int 40 `Add` Int 2 42 *Main> runEval $ Let ("x",Int 1) $ Int 4 `Add` Var "x" 5 ソースコード import Control.Monad.Reader dat

    Readerモナドを試してみる - みずぴー日記
  • Writerモナドを試してみた - みずぴー日記

    30分プログラム、その670。Writerモナドを試してみました。 前回がReaderモナドだったので、今回はWriterモナドを試してみました。 The Writer monadには、Writerモナドは裏でログをとったりするのに便利だと書いてあったので、関数の呼び出しを記録してみました。 使い方 *Main> runWriter $ fib 10 (55,["fib(10)", "fib(9)", "fib(8)", "fib(7)", "fib(6)", "fib(5)", "fib(4)", "fib(3)", "fib(2)", "fib(2)", "fib(3)", "fib(2)", ....]) とやって、普通のフィボナッチ数の定義が、いかに非効率かに驚く。 そのあと、 *Main> runWriter $ fibi (1,0) 10 (55,["fibi(10)","fi

    Writerモナドを試してみた - みずぴー日記
  • Inemuri nezumi diary(2009-01-08) - _ unsafePerformIO の使用は限定されています。ご利用は計画的に。

    _ unsafePerformIO の使用は限定されています。ご利用は計画的に。 いたるところで、 unsafePerformIO を見かけるようになったのでひとこと言うといたるわ。「Unsafe やって書いてある」やろ。おっと、地が出てしもた。 unsafePeformIO はもともと Haskell の規格 Haskell98 にはありません。初めて現れたのは、 "The Haskell 98 Foreign Function Interface 1.0 An Addendum to the Haskell 98 Report" の 5節 Marshalling についての、5.1 節 Foreign モジュールが提供するインターフェースについてです。 unsafePerformIO :: IO a -> a Return the value resulting from execut

  • Data.IORefを使ってみよう - みずぴー日記

    30分プログラム、その513。Haskellでmutableな変数が使えると評判のData.IORefを使ってみた。 で、いざ書き換え可能な変数があるとなると、なかなかいいサンプルが思いつかない。しょうがないので、フィボナッチ数で関数が何回呼び出されるかカウントするやつを作ってみた。 わりとStateモナドとの違いが分からない。 使い方 *Main> fibWithCount 10 (55,177) ソースコード import Data.IORef incr ref = do modifyIORef ref (+1) fib :: IORef Int -> Int -> IO Int fib ref n = do incr ref if n <= 1 then return n else do x <- fib ref (n-1) y <- fib ref (n-2) return $ x

    Data.IORefを使ってみよう - みずぴー日記
  • ST で破壊的なヒープソート - あどけない話

    ST モナドの中では、配列に対して破壊的な操作ができるので、試しにヒープソートを作ってみました。ヒープソートのアルゴリズムは、「珠玉のプログラミング」を参考にしました。 > x <- randomArray 10 100 > x array (1,10) [(1,71),(2,27),(3,85),(4,6),(5,79),(6,8),(7,58),(8,97),(9,25),(10,89)] > heapSort x array (1,10) [(1,6),(2,8),(3,25),(4,27),(5,58),(6,71),(7,79),(8,85),(9,89),(10,97)] 以下がそのコードです。(UArray に指定するインデックスや値の型制約はうまく書けないみたいなので、型を決めうちにしています。) import Control.Applicative import Cont

    ST で破壊的なヒープソート - あどけない話
  • Stateモナドを今度こそ理解する(3) - Pixel Pedals of Tomakomai

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

    Stateモナドを今度こそ理解する(3) - Pixel Pedals of Tomakomai
  • Subject: [haskell-jp:157] Re: Stateモナドを使った実例コーディングは?

    From: Jun Mukai <mukai@j...> Date: Wed, 23 Jan 2008 22:27:22 -0800 Subject: [haskell-jp:157] Re: Stateモナドを使った実例コーディングは? 向井といいます。 State モナドは名前が混乱の原因だと思います。 これは私見ですが、まずは Writer モナドと Reader モナドを理解すると State モナドは理解しやすいと思っています。さらに、その前段階として Identity モナドも踏まえていると見通しがはっきりします。 以下、ちょっと長くなりますが、どういう意味か説明してみます(わかりにくかっ たらごめんなさい)。 Identity モナドというのは、関数合成のことだと思うことができます。細かい 型を気にしなければ、 return x >>= f >>= g は g (f x

    kanbayashi
    kanbayashi 2011/12/16
    なるほど
  • Route 477 - gemcutterの使い方まとめ (2009年秋)

    ■ [haskell] モナドって結局なんなの 社内勉強会でモナドについて発表しました。分かった気がするたびにすぐに手からすりぬけてしまう、それがモナド…! 追記: モナドそのものが何なのかとか考えないほうがいいんじゃないですかね! [Twitter / いーぐるとまとより引用] まさにその通りだと思います(笑)。IOの使い方、Maybeの使い方、Stateの使い方などを押さえておけば、 中がどうなってるかなんて知らなくても大丈夫。 でも、モナドの持つ「なんか秘技がありそうな感じ」が、中を覗いてみたくさせるんですよね。 この、どこまで掘っても自分の知らないことが出てくる感じがHaskellの魅力なのかも。 Haskell の当にすごいところは、「なぜなに」を問いかけることでいつまでもプログラマが成長できるところにある。 [ふぁぼったー / ikegami__より引用] 一問一答 Q. モ

    Route 477 - gemcutterの使い方まとめ (2009年秋)
    kanbayashi
    kanbayashi 2011/12/16
    今まで見た中では一番しっくり来た
  • Stateモナド - おっぱい大魔神の日記

    http://itpro.nikkeibp.co.jp/article/COLUMN/20070109/258229/ より. newtype State s a = State { runState :: s -> (a, s) } instance Monad (State s) where return a = State $ \s -> (a, s) m >>= k = State $ \s -> let (a, s') = runState m s in runState (k a) s' State モナド内の値は、ある初期値から、(value,newState) のペアへの遷移関数として表現される. Stateはs -> (a, s)という型を持つ関数を格納するコンテナです。 Stateモナドのreturnは,aという値から\s -> (a, s)というラムダ抽象を作り出し,

    Stateモナド - おっぱい大魔神の日記
  • Haskell で for 文 - 捨てられたブログ

    Haskell で無理矢理 for 文を書こうとしたらどうなるかなと思って書いてみました。 for init cond next action | cond init = action init : for (next init) cond next action | otherwise = [] forM init cond next action = sequence (for init cond next action) forM_ init cond next action = sequence_ (for init cond next action) それぞれの型は以下の通りです。 for :: t -> (t -> Bool) -> (t -> t) -> (t -> a) -> [a] forM :: Monad m => t -> (t -> Bool) -> (t ->