2012-01-01から1年間の記事一覧

参考になった

http://d.hatena.ne.jp/notogawa/20121201/1354389374 hoogleの使い方(型から引く)という技もそうだが、トップダウン思考が参考になった。

モナド版ParserをApplicative Parserにしてみる

Applicativeの勉強のため、プログラミングHaskellのパーサーをApplicativeに変更してみた。 書いていると、ApplicativeというよりはAlternativeにするべきと分かったので、そのように実装した。 import Data.Char import Control.Applicative newtype Parser…

C#/Java頭の私がHaskellに戸惑ったところ(ただしモナドを除く)

いろいろあるが、以下の3つかな。 値コンストラクタは型ではない たとえば、CircleとRectangleを含むShapeという独自のデータ型を定義するとする。Circleは半径を、Rectangleは幅と高さを持つとする。そういうデータ型はHaskellだとこんな感じで定義する。 d…

Haskell脳

flip constとconst idが等価だってことは、Haskellになじんでくると素直に思い浮かんでくるものなのか? 命令型でいうと、forがwhileで書ける、みたいな感じで、プログラマの常識なのか? もしそうなら、まだぜんぜんHaskell脳になってないな、おれの頭。 や…

FunctorとApplicativeとMonad

ファクンタ⇒アプリカティブ⇒モナドの順で力強くなってることを、リストを例に考えてみる。 ファンクタ1つのリストに対して、1引数の変換(map)ができる。 アプリカティブ複数のリストに対して直積をとって、多引数の変換ができる。 モナド変換だけじゃなく、…

ラムダ計算とラムダ式とC#

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

プログラミングHaskellついに完了

16ヶ月もかけてしまったが、ついに全章の写経と練習問題を終えた! この先も本で学ぶとすれば、「すごいH」本か、もしくは「Real World Haskell」だろうか? でも、まずはrst76が紹介していた確率プログラミングかな。 例題だと、「雨が降る確率が0.3、その…

第13章 プログラムの論証 #7

13.9 練習問題 以下の定義が与えられているとする。 map f [] = [] map f (x:xs) = f x : map f xs (f.g) x = f (g x) map f (map g xs) = map (f.g) xsであることを、xsに対する数学的帰納法で証明せよ。 xs = []の場合 左辺 = map f (map g []) = map f []…

第13章 プログラムの論証 #6

とりあえず残りの問題だけ 13.9 練習問題 以下の定義が与えられているとする。 map f [] = [] map f (x:xs) = f x : map f xs (f.g) x = f (g x) map f (map g xs) = map (f.g) xsであることを、xsに対する数学的帰納法で証明せよ。 以下の定義が与えられて…

C#よりF#が向いている領域って?

F#

Stack Overflowに質問されていた、「In what areas might the use of F# be more appropriate than C#?」の回答を翻訳してみた。 simon cousinsの回答 私は、とあるエネルギー会社向けに、発電所のポートフォリオに関する国の発電スケジュールと取引ポジショ…

第13章 プログラムの論証 #5

13.9 練習問題 付録Aにある標準ライブラリの中から重複のあるパターンを使って定義されている関数を探せ。 教科書を見ながら抜き出してみる。 ガードも重複パターンのうちかな? A.1 クラス min, max :: a -> a -> a min x y | x <= y = x | otherwise = y m…

第13章 プログラムの論証 #4

13.9 練習問題 付録Aにある標準ライブラリの中から重複のあるパターンを使って定義されている関数を探せ。 いま手元に教科書がなくて、付録Aを確認できないので、今日はパス。 add n (Succ m) = Succ (add n m) であることをnに対する数学的帰納法で示せ。 n…

第13章 プログラムの論証 #3

13.7 コンパイラーの正しさ 忙しかったのでかなり間が空いてしまった。 今回は10.5節で出てきた関数を、10.5節とは違った形で(コンパイルして実行することで)評価する関数を定義して、その関数の振る舞いがもとの関数の振る舞いと一致することを証明する。…

第13章 プログラムの論証 #2

13.5 リストに対する数学的帰納法 リストも再帰的にオブジェクトが構築される型なので、数学的帰納法で論証できる。 reverse (reverse xs) = xsの証明。 xs = [] の場合 reverse (reverse []) = reverse [] = [] xs = ns のときに reverse (reverse xs) = xs…

第13章 プログラムの論証 #1

ついに最終章! この最終章では、Haskellプログラミングを論証する方法を紹介する。まず等式推論の復習から始め、それがHaskellにどのように適用できるかを考える。そして、数学的帰納法という重要な技法を説明し、連結演算子を数学的帰納法に似た手法で除去…

第12章 遅延評価 #4

12.9 練習問題 以下の式において、簡約可能式はどこか?また、選び出した簡約可能式が、最も内側か、 最も外側か、両方か、いずれでもないかを考えよ。 こんな感じ?簡約可能式に抜け漏れがなければいいけど。 1+(2*3) 2*3...最内 1+()...最外(追記)原著の…

第12章 遅延評価 #3

問題文だけ転記。 12.9 練習問題 以下の式において、簡約可能式はどこか?また、選び出した簡約可能式が、最も内側か、 最も外側か、両方か、いずれでもないかを考えよ。 1+(2*3) (1+2)*(2+3) fst (1+2, 2+3) (λx→1+x) (2*3) 式 fst (1+2, 2+3) を評価する際…

第12章 遅延評価 #2

12.5 無限のデータ構造 Haskellの遅延評価は、無限のデータ構造を相手にした時も、必要がない限り無限回の評価は行わない。 一般的に、遅延評価は次のような性質を持つ。すなわち、遅延評価を用いると、式が利用される文脈が要求する回数だけしか、その式は…

第12章 遅延評価 #1

12.1 導入 一般的な命令型言語は、同じ式に対する評価順序が違うと結果が変わることがあるが、Haskellではどのような順序で評価しても(停止するのでない限り)同じ結果が得られる。 ぐぐってみたら、「チャーチ・ロッサー性」というのかな? 12.2 評価戦略 簡…

F#のコンピュテーション式

F#

ってHaskellのdo記法なんだね。

第11章 切符番号遊び #3

11.7 練習問題 関数 choices、exprs、およびevalを用いて、1、3、7、10、25、50に対し可能な式は33,665,406個あり、そのうち4,672,540個のみが有効であることを確かめよ。 こんな感じでいいのかな。 もっと見た目よく関数合成したいんだけど。F#の |> みたい…

第11章 切符番号遊び #2

11.7 練習問題 ライブラリ関数concatとmapを用いる代わりに、リスト内包表記を使って、組み合わせの関数choicesを再定義せよ。 10章の練習問題でリストモナドについて書いたことを思い出せば簡単。 choices' :: [a] -> [[a]] choices' xs = [zs | ys <- subs…

Haskell vs F# リベンジ

昨日のHaskellコードをF#に移植してみた。 type Point = {X: int; Y: int;} static member ( + ) (p: Point, q: Point) = {X = p.X + q.X; Y = p.Y + q.Y;} static member ( - ) (p: Point, q: Point) = {X = p.X - q.X; Y = p.Y - q.Y;} type Pair = {Front…

会社のプログラミングコンテスト

10年ぐらい前の問題をHaskellで解いてみた。 問題は、「8×8ますの正方形のパネルを同じ形に2分割する分け方はいくつあるか」というもの。 ↓のコードは回転同型は考慮しているが鏡像同型は考慮してない。でもすっきりと書けたんじゃないかな。 (追記)Node型…

第11章 切符番号遊び #1

数日かけて写経したのでまとめて更新。 11.1 導入 切符番号遊びは、切符の端に書いてある四つの数字を使って、10になるように数式を組み立てる遊びである。 (中略)この章では、ゲームのルールを少し変更する。利用する数は任意の大きさで、全部を使わなく…

第10章 型とクラスの定義 #8

10.8 練習問題 以下のインスタンス宣言を完成させよ。 instance Monad Maybe where ... instance Monad [] where ... ここで[]は、[a]から型変数を取り除いたリスト型を表す。 ヒント:最初に、それぞれのインスタンスのメソッド return と >>= の型を考えよ…

第10章 型とクラスの定義 #7

10.8 練習問題 関数 isTaut と、前の二つの章で定義したパーサーと対話プログラムのライブラリを用いて、対話的に恒真式か検査する関数を実装せよ。ユーザーがキーボードからわかりやすい文法で命題を入力できるようにすること。 ヒント:8章で定義した数式…

第10章 型とクラスの定義 #6

10.8 練習問題 再帰と関数addを用いて、自然数の乗算関数 mult :: Nat -> Nat -> Nat を定義せよ。 これは楽勝。(10.3で定義したNatはゼロも自然数だったことを思い出して) module TenEightOne where import TenThree mult :: Nat -> Nat -> Nat mult Zero…

第10章 型とクラスの定義 #5

10.6 クラスとインスタンスの宣言 前にも書いたけど、Haskellのクラスは型クラスで、型クラスのインスタンスは型。 最初はBool型がEqクラスを実装する例。自分でも手を動かしたかったので、Bool型とEqクラスを自分で定義してみる。演算子はちょっと悩んだけ…

第10章 型とクラスの定義 #4

10.5 仮想マシン 二つ目の長い例題として、整数と加算演算子からなる単純な数式の型と、この数式を評価して整数にする関数を考えよう。 data Expr = Val Int | Add Expr Expr value :: Expr -> Int value (Val n) = n value (Add x y) = value x + value y …