background preloader

FP

Facebook Twitter

モナドの力でループからbreak - 厨二病患者のプログラミング入門. モナドの力でループからbreak モナドを使えば、純粋関数型言語のHaskellでもgotoやbreakができるようになります。

モナドの力でループからbreak - 厨二病患者のプログラミング入門

(何に使うのかは知りませんが) モナドでbreakを実現するために、まずはループの状態を持つ型を定義しましょう。 Data Break a = Break Label | Continue Label | Run a Breakはループからの脱出、Runは処理の継続、Continueはループの先頭へ戻ることを意味しています。 Data Label = Inner | Label String deriving (Eq) Label型はこのように定義しました。 ループの状態を表すことができるようになったら、次はモナドを作りましょう。 RunBreakT'を呼ぶとループを含む関数が実行され、結果が返ってくるようになっています。 BreakTはモナド変換子ですので、次はBreakT型がきちんとモナド変換子として動いてくれるようにしましょう。 Instance Monad m => Monad (BreakT m) where return = BreakT . return .

Maybeモナドなんかの実装と似たような感じで、BreakまたはContinueが出現したらそれ以降の処理はすべて飛ばすようになっています。 しかし、これでは一度どこかでbreakすると、そのままブロック内部どころか処理の最後まで飛ばされてしまうのではないかと思われるかもしれません。 まずはwhileを実装してみましょう。 これで一応whileはできるようになりましたが、あとでforeach等にも使い回しできそうな部分は分離しておきましょう。 同じような要領でforeach等も作ってみましょう。 次は肝心の、ループから抜けだす関数です。 モナドの勘所 - 他人のHaskell日記 - haskell. ■ モナドの勘所 ここを見ながらお勉強。

モナドの勘所 - 他人のHaskell日記 - haskell

少しだけモナドに親しくなれた気がする。 概要 どんな関数も「(1段の)モナド」を返す関数に変換できるよ。 「モナドを返す関数」同士を合成して「モナドを返す関数」にできるよ。 いきなり脱線:無視しましょう。 普通、圏論で使われるのは、Haskellで言うところの(=<<)であるが、Haskellは(>>=)の方を優遇している。 普通の関数適用で考えてみよう。 次の関数で考える。 関数合成の妙技 - あどけない話. Project Euler - PukiWiki. 最高のHaskell入門書 - あどけない話. Projecteuler haskell. HaskellでProject Eulerに挑戦してみた / LiosK-free Blog. Id:gomi-boxに触発されて、Project Eulerに挑戦してみた。

HaskellでProject Eulerに挑戦してみた / LiosK-free Blog

Project Eulerみたいな、アルゴリズム的なものを書いて一人でくねくねする遊びは、Haskellとの相性が良すぎる。 コードは続きで。 Problem 1 Problem 1 - PukiWiki 1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。 Prob1 = sum [x | x <- [1..999], (mod x 3 == 0) || (mod x 5 == 0)] Ans. 233168 リスト内包表記が便利すぎる。 Problem 2 Problem 2 - PukiWiki (フィボナッチ) 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 Prob2 = sum [x | x <- takeWhile (< 4000000) fib, even x] where fib = 1:2:[x + y | (x, y) <- zip fib (tail fib)] Haskell手習い - でこすけの日記. Asia 2006 Tokyo Sessions - Learning Haskell. Speaker:Audrey Tang Date: Mar 30, 2006 13:30 - 14:15 Location: Convention Hall Language: English What's faster than C++, more concise than Perl, more regular than Python, more flexible than Ruby, more typeful than C#, more robust than Java, and has absolutely nothing in common with PHP?

Asia 2006 Tokyo Sessions - Learning Haskell

It's Haskell! Tired of writing unit tests to cover corner cases? 圏論の入門書. オンライン上の圏論のテキスト - Formal Methods Forum. Redirecting. Redirecting. Www.ipl.t.u-tokyo.ac.jp/~hamana/local/monad.pdf. Kurt.scitec.kobe-u.ac.jp/~shg/SFCArchives/docs/shortcut_monad.pdf. Learn You a Haskell for Great Good! - Chapters. Haskell で動的計画法を書くための3つの方針 - tosの日記. Haskell で動的計画法を書くための3つの方針 アルゴリズムの代表っぽい存在とも言えるDPですが,Haskellは参照透明なので書きにくいと思われがちです.

Haskell で動的計画法を書くための3つの方針 - tosの日記

しかし,実際は,C言語やSTLなしのC++より遥かに簡単に動的計画法が書けます. リストを用いる 最初に知るであろう方法. フィボナッチ数列の第100項だと, let f = 0 : 1 : zipWith (+) a (tail a) in f!! です. 「ずらして足したものを後ろにつなげる」と言えばいいのでしょうか. これについては,他でよく解説されているので詳しくは説明しません. 利点: リストの知識のみでよい. 欠点: 使えるケースが限られる. 添字を自由に用いることができないので,ただの「Haskellでフィボナッチ数が楽にかける」という宣伝ぐらいにしか使えないかもしれません. Arrayを用いる 添字を用いて参照したいときに役立つ方法. Haskellでメモ化を行うもう一つの方法 - 純粋関数型雑記帳. ■[Haskell]Haskellでメモ化を行うもう一つの方法 はじめに Haskell で動的計画法を書くための3つの方針 - tosの日記 これを読んで、私もちょっと前にHaskellでメモ化をやる方法を考えていたことを思い出したので、書いてみることにします。

Haskellでメモ化を行うもう一つの方法 - 純粋関数型雑記帳

Haskellでのメモ化は、私のかなり昔の駄文(リアルにびっくりするほど駄文なのでご注意。 メモ化の綴りも間違ってます)や、このあたりに日本語の文章があります。 これらのページでのメモ化実現方針は、1. メモ化においてやりたい事は、テーブルの作成でもテーブルの更新でも無くて、一回計算した値がもう一度計算されないようになっているということです。 基本的な考え方 簡単のために、メモ化関数の引数は1つの自然数とします(この制約は後である程度ゆるくします)。 無限リストからの類推で、無限ツリーというものを考えます。 実装. Kazu/material/2011-ll-haskell.pdf. モナドはメタファーではない. Scala界の関数型プログラミング一派を代表する論客の一人、@djspiewak が 2010年に書いた "Monads Are Not Metaphors" を翻訳しました。

モナドはメタファーではない

翻訳の公開は本人より許諾済みです。 翻訳の間違い等があれば遠慮なくご指摘ください。 「論理と計算のしくみ」が大変ためになった - a geek born in Tomakomai. プログラミング Coq. 2006-10-08 - λx.x K S K @ はてな. Haskellライブラリ入門 (2011年版) - あどけない話. Haskellライブラリ入門 (2011年版) この記事では、基本ライブラリである Prelude の関数をだいたい理解した人が、次に知るべきライブラリを紹介します。

Haskellライブラリ入門 (2011年版) - あどけない話

自由自在にリストを使いこなせ、正規表現がなくてもプログラミングができるんだなと実感した人を対象にしています。 この記事のテーマは、脱リストです。 リストはとても柔軟ですが、リストで表現されている文字列は、メモリーをたくさん消費しますし、なにより遅いのです。 実用的なプログラムを書くためには、必要に応じて適切なデータ構造を使う必要があります。 Containers containersは、文字通りコンテナ型をいくつか集めたパッケージです。 Containers に入っているモジュールはすべて眺めましょう。 Purely functional (永続的)な可変ハッシュで、今一番注目されいるのは hashmapです。 Purely functional data structure の入門としては、20分でわかるPurely Functional Data Structuresが秀逸です。 ByteString バイト列あるいはASCII文字列を操作するには、bytestring を使います。 まず、OverloadedStrings という言語拡張を覚えましょう。 ByteString は、リストと違ってパターンマッチできませんから、ガードを駆使して関数を定義することになります。 ByteString には以下の四つのモジュールがあって、どれを使えばいいのか悩むかもしれません。 Data.ByteString (正格 Word8) Data.ByteString.Char8 (正格 Char) Data.ByteString.Lazy (遅延 Word8) Data.ByteString.Lazy.Char8 (遅延 Char) たとえば、Data.ByteString と Data.ByteString.Char8 で定義されている ByteString は同じ物です。

なお、OverloadedStrings のためには、Data.ByteString.Char8 の instance 宣言を読み込む必要があります。 という訳で、違いを気にすべきなのは、正格 ByteString と遅延 ByteString です。 Text Parsec. 「モナドは象だ(Monads are Elephants)」日本語訳 — Japanese Translation of Monads are Elephants v1.0 documentation.