読者です 読者をやめる 読者になる 読者になる
ようこそ。睡眠不足なプログラマのチラ裏です。

すごいH本の素朴な確率モナド

年末年始の連休から中五日あっての三連休で、正月ボケをぶり返してしまいそうな今日この頃ですが、いかがお過ごしでしょうか。 すごいH本こと、書籍「すごいHaskellたのしく学ぼう!」の最後のほう、第14章「もうちょっとだけモナド」の 14.8 (P356)にて、…

圏論でアハ体験

もう1週間以上前になりますが、Code2012という合宿イベントに参加してきました。いろいろな方との交流あり、温泉あり、クラウディアさんありと大変楽しかったので、ぜひ来年も参加したいです。 で、VBerのくせにそちらで「5分じゃわからないモナド - 圏論な…

F#で順列(Permutation)と組み合わせ(Combination)。YOU、Listモナドしちゃいなよ。集合モナドもあるよ。

以前、C#で順列(Permutation)と組み合わせ(Combination)をすべて列挙してみようという記事を書きました。 今見ると、前に思っていた以上に「しょっぱいなぁ」と思わざるを得ませんが、C#で書き直すつもりになれません。 今回は、超イケてる言語のF#で書きま…

FizzBuzz問題から学ぶモナド

前回のエントリでモナドについて熱く語りました。今回はゆるいモナドの雑記です。 モナドを利用してFizzBuzz問題を書いてみることで、「モナドってなんなん?なにしてくれちゃってるん?」ということが、 もしかしたら分かるかもしれないよ、という息抜き的…

快刀乱麻を断つモナド - F#とIOモナドとコンピューテーション式の奥義と

,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『F#でIOモナドっぽい何かを作ろうとしていたら、 i|:!ヾ、_ノ/ u {:}//ヘ いつのまにか、全然別モノのLazyモナドをつくっていた。』 |リ u'…

F#で楽々breakとcontinue。継続モナドまじパネぇっす!

id:einblickerさんが、「F#で継続モナド - einblickerの日記」というステキな記事を書いてくださいました。グッジョブすぎる! 以前、F#で継続渡し形式(CPS)変換を抽象的に考えてみたら、それってつまりHaskellの継続モナドみたいなものでした。ということで…

Observableコンピューテーション式はモナド則を満たしているか否か。

前回のエントリ「F#でRxる。よく訓練されたF#erはコンピューテーション式をつくる。」で紹介いたしました、 Observableコンピューテーション式について補足します。モナド則を満たしているか否かについてです。 Haskellにおいて、モナドがモナド則を満たして…

モナディックなパーサ・コンビネータFParsecを使おう。てゆうかParsec(Haskell)のApplicativeスタイルがやばい。

Parsec(Haskell)のApplicativeスタイルがやばすぎるので、FParsecでApplicativeスタイルしてみた。 FParsecとはFParsec とは Haskell のパーサ・コンビネータライブラリ Parsec をF#に移植したものです*1。 では、パーサ・コンビネータとはなんでしょうか。…

F#で継続渡し形式(CPS)変換を抽象的に考えてみたら、それってつまりHaskellの継続モナドみたいなものでした。ということで継続ワークフロー(簡易版)作った。

[前置き] 継続とはプログラミングにおいて「継続」とは、ある計算のある時点における「残りの計算」を表す概念のこと。 つまり、ある計算過程の瞬間におけるその過程の未来全体を表すものを意味する。 プログラミング言語で継続を扱う機能を導入すると、ユー…

F#でStateモナドしてみよう。そうですよね、副作用は怖いですものね。

id:NobuhisaさんのWorkflowでモナド - (hatena (diary ’Nobuhisa))に触発されてF#でStateモナドしてみました。 ですが、Haskellのド素人でF#初心者なのでいろいろと間違っているかもしれません。 とりあえず的に、取り急ぎコードをうpしておきます。(F#CTP)…

拡張ユークリッド互除法も再帰で書いた方が自然に見える

最適化のために最大公約数を求める必要があって、 ユークリッド互除法と拡張ユークリッド互除法を書いたので、チラ裏に残しておく*1。 ユークリッド互除法まずはよく見る実装をC#で public static int Gcd(int a, int b) { while (b != 0) { int r = a % b; …

Project Euler第1問目

Project Eulerはじめました。(冷やし中華的な意味で) 問題 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 100…

いまさら聞けないアルゴリズム その1「ハノイの塔」 Part.2

前回に引き続きまして、Haskell版「ハノイの塔」も書いてみた。 {-ハノイの塔-} main :: IO () main = putStr $ concat $ [write x | x <- hanoi "A" "B" "C" 3] hanoi :: String -> String -> String -> Int -> [(String, String)] hanoi _ _ _ 0 = [] hano…

Haskellで虫食い算的なもの

後日LINQで解いてみた、LINQで虫食い算的なものはこちらです。 虫食い算を解く {-虫食い算-} -- 4○○ -- × ○○ -- -------- -- ○○○○○ -- ※ただし、○には4を除く0〜9の数字を1つずつ使用 -- また、桁の先頭は0ではないこと。 import Control.Monad num = …

Haskellで世界のナベアツ問題

※以前C#で書いたネタはこちら→FizzBuzz問題と世界のナベアツ ※後にPowerShellで書いたネタはこちら→PowerShellで世界のナベアツ問題 コンバット越前よろしく、 せっかくだから俺はHaskellで世界のナベアツ問題を書くゼ(ネタがないという意味で) {- Haskellで…

Haskellのお勉強 その21

モジュールとはHaskellで言うモジュールとは、いわゆる関数や型の定義をまとめであり、 Javaで言うところのパッケージであり、.NET(C#,VB)で言うところの 名前空間(namespace)のことと考えて差し支えない。 ■Haskellのモジュールに属するもの ・変数 ・型コ…

モナド則かっこいい

■モナド則 1. (return x) >>= f == f x 2. m >>= return == m 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g) 最初はなんのこっちゃわからんかったが、意味理解。 誰が考えたか知らんが、これ考えた人頭良いな。 1.と2.はまぁ当たり前として、3.の結合則が…

Haskellのお勉強 その20

class宣言Haskellで新しい型クラスを宣言するには、class宣言を用いる。 例えばEqクラスの宣言であれば、 class Eq a where (==) , (/==) :: a -> a -> Bool {- クラスメソッドの型宣言 -} x == y = not (x /= y) {- (==)クラスメソッドのデフォルト実装 -} …

モナモナモナド〜

モナドを勉強するためにHaskellを勉強し始めたといっても過言ではない。 そんなモナモナモナドなわけですが、とりあえず、モナドのすべてを読みつつ実戦している。 モナドのさわり部分とか、まあ基本的なことは理解した(つもり)。 たぶん完全に理解するまで…

Haskellのお勉強 その19

クラスメソッドEqクラスの制約を満たす型は、「(==)関数で同値検査ができる」 あるいは、「(/=)関数で同値ではないという検査ができる」という制約を満たす。 また、Ordクラスは「(>)関数や( これらの関数は、「そのクラスを特徴付ける関数」と考えることが…

Haskellのお勉強 その17

type宣言type宣言を使うと型に別名をつけることが出来る。例えば、 type FilePath = String と書くことで、String型の別名としてFilePath型が使えるようになる。 type宣言は型に別名をつけるだけで、型を作る方法が増えるわけではない。 つまり、新しいデー…

Haskellのお勉強 その18

型クラスとは型クラスとは、型変数の多相型に制限を加えるために使われるクラスのことである。 たとえばリストをソートするsort関数の型宣言をしたいような場合、型変数aを使って sort :: [a] -> [a] と書きたいはず。なぜなら、aが整数のリストであっても浮…

Haskellのお勉強 その15

共有体スタイルで代数的データ型を使う共用体スタイルでは、たとえば次のような感じで代数的データ型を宣言する。 data PTItem = Param Int | Text String 上記のようにdata宣言を書くと、PTItem型が2つの代数的データ型「Param Int」と「Text String」の …

Haskellのお勉強 その16

エラトステネスの篩(ふるい)をHaskellで書くエラトステネスの篩とは、与えられた整数以下の素数すべてを探し出す素数判定アルゴリズムの一種で、 古代ギリシャの学者であるエラトステネスによって紀元前3世紀頃に考案された。 このアルゴリズムでは、任意の…

Haskellのお勉強 その14

列挙型スタイルで代数的データ型を使う例えばファイルを開くときのモード「ReadOnly」「WriteOnly」「ReadWrite」の 3つの状態を表すような型を定義したいような場合、次のような代数的データ型を使うことができる。 data OpenMode = ReadOnly | WriteOnly …

Haskellのお勉強 その13

続、構造体スタイルとしての代数的データ型についてパターンマッチによるフィールドへのアクセスデータコンストラクタを使ったパターンマッチを利用することで、 data宣言した型のフィールドにアクセスすることができる。 data Anchor = A String String com…

Haskellのお勉強 その12

代数的データ型とはHaskellで新しい型を定義するには、data宣言を利用する。 data宣言で定義できる型のことを、「代数的データ型」と呼ぶ。 で、代数的データ型てなんやねん。なんのことだかさっぱりわからない。 代数的データ型ってのは様々な目的に使われ…

Haskellのお勉強 その11

前回勉強したflip関数についてググってたら、面白そうなのを見つけた。 こりゃ、関数合成やら部分適用やらポイントフリースタイルの練習教材としてもってこいだ。 3引数のflipをポイントフリースタイルで書こう元ネタの元ネタ haskellのある暮らし - 頭の体…

Haskellのお勉強 その10

値としての関数関数型プログラミング言語における関数ってのは値です。 値は変数を束縛することができます。したがって、関数は変数を束縛することができます。 また、関数は値なので、他の関数に引数として渡すことができます。 というわけで、高階関数の復…

Haskellのお勉強 その9

Haskellの基本的な構文コメントラインコメントとブロックコメントがある。 ブロックコメントはネスト可能。 Prelude> 1 + 2 --test 3 Prelude> 1 + {-test-} 2 3 Prelude> 3 * {- test {- hogehoge -}-} 2 6 また、リテレイト形式といって、基本コメントのド…

Haskellのお勉強 その7

参照透明性参照透明性とは、計算機言語の概念の一種である。コンテキストに左右されることなく、 式の値はその構成要素である変数や関数によってのみ定まることを参照透明性*1があるという。 具体的には、変数の値は最初に定義した値と常に同じであり、 関数…

Haskellのお勉強 その8

基本的な値と、その周辺の関数真偽値Haskellno真偽値はTrueかFalseのみ。その型はBool型。 関連関数として、not関数、(&&)関数、(||)関数などがある。 Prelude> not True False Prelude> (&&) True False False Prelude> not True && False False Prelude> F…

Haskellのお勉強 その5

モジュールとimport宣言Haskellプログラムはモジュールという単位に分割されている。 モジュールは関数や変数や型の集まりであり、 Haskellでは関数や変数は必ずなんらかのモジュールに属している。 他のモジュールで定義されている関数などを使いたい場合は…

Haskellのお勉強 その6

遅延評価Haskellの大きな特徴として、遅延評価を基本原則としているというのがある。 遅延評価とは、評価しなければならない値が存在するとき、実際の計算を値が必要になるまで行わないことを言う。 つまり、遅延評価はトヨタ式の、必要なときに必要なものを…

Haskellのお勉強 その4

concat関数 {-concat関数の型-} concat :: [[a]] -> [a] main = do cs <- getContents putStr $ expand cs expand :: String -> String expand cs = concat $ map expandTab cs expandTab :: Char -> String expandTab c = if c == '\t' then " " else [c] c…

Haskellのお勉強 その2

静的型チェックHaskellにも、Javaや.NETと同じように静的な型チェック(static type checking)がある。 「静的な」というのは、「コンパイル時に」と同じ意味であるから、 Haskellの場合もコンパイル時に、処理系が型のチェックを行ってくれる。 このようにコ…

Haskellのお勉強 その3

高階関数(higher order function)高階関数とは、プログラミング言語において、関数を引数としたり、 あるいは関数を戻り値とするような関数のことである。 関数型プログラミング言語Haskellにおいては、まず「関数」という値があり、 関数名はそれに束縛され…

Haskellのお勉強 その1

「ふつける」やら「ふつハス」の愛称で親しまれている「ふつうのHaskellプログラミング」を買いました。 というわけで、関数型プログラミングHaskellのお勉強をのんびりはじめます。 はじめてのHaskellはじめての言語の勉強と言えば、 まずはお約束という感…