ぬかいわし、タレカツ、鶏の半身揚げ、そして笹団子。新潟を平らげる2泊3日 今回の旅の目的地は新潟。新潟には申し訳ないのだが、自発的に決めた目的地ではない。JR東日本の「どこかにビューーン!」という行き先ガチャサービスにより決定されたのだ。新潟といえば酒どころ米どころ。ちょうど新米の季節だ。どんとこい。古町エリアに宿を取っ…
Haskell Hackathon が楽しそうだったので、昔作りかけて放置してあった Haskell コンパイラを引っ張り出してきました。 せっかくなので、最もタメになる初心者用プログラミング言語であるところの Lazy K へのトランスレータにしてみました。 hs2lazy.tgz (最新版は github にあります) こんなのが動きます。 {- reverse lines -} main :: Stream -> Stream main stdin = toStream $ unlines $ reverse $ lines $ fromStream stdin main の型が何やら変ですが気にしない方向で。 もちろん tarai も動きます。Intの実装がChurch数なので速くはないですが…。 $ hs2lazy Prelude.hs tarai.hs >tarai.lazy
はじめに Haskell で動的計画法を書くための3つの方針 - tosの日記 これを読んで、私もちょっと前にHaskellでメモ化をやる方法を考えていたことを思い出したので、書いてみることにします。 Haskellでのメモ化は、私のかなり昔の駄文(リアルにびっくりするほど駄文なのでご注意。メモ化の綴りも間違ってます)や、このあたりに日本語の文章があります。 これらのページでのメモ化実現方針は、1. 計算済み値を保持するテーブルをMapなどを用いて用意する 2. そのテーブルを副作用を用いて更新する、というものになっています。なるほど、これは手続き型言語との対比でとても直接的な実装です。しかし、テーブルを更新するために関数全体がモナドになってしまったりして、あまり使い勝手が良くなさそうです。モナドであることを悟らせないために、演算子をモナド化したり、あるいはモナドじゃなくするためにunsa
不動点コンビネータを使うと、どうして無名関数で再帰ができるのかを考えてみる。 名前を取り去る 以下の階乗を計算する関数 fact を考える。 fact 0 = 1 fact n = n * fact (n - 1) これは、以下のように一つの式に変形できる。 fact n = if n == 0 then 1 else n * fact (n - 1) さらに、ラムダ式に変形できる。 fact = \n -> if n == 0 then 1 else n * fact (n - 1) ここで、fact という名前は使えないので、関数を引数に取るように変更してみる。 fact = (\g n -> if n == 0 then 1 else n * g (n - 1)) fact (※1) 不動点登場 ※1 の無名関数を h で表すとする。 fact = h fact (※2) ここで、x
上のエントリでのプチ収穫。 モナドとコンビネータ論理のコラボ!とか喜んでたら、既に先達が。 [Haskell-cafe] Point-free style 【オブジェクト倶楽部: 2008-33号】 import Control.Monad.Reader s = flip (>>=) . flip k = return そういえばArrowでも書けるな。 毎日Haskell - FSWikiLite(2007-08-08) import Control.Arrow s = ((app .).).(&&&) もちろんこれもある。でも Control.Applicative って、他の場面で使ったことない。 何のためのモジュール? import Control.Applicative s = (<*>) でもやっぱり、いちいち import するのは嫌だ。Prelude の関数で書きたい。 と
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く