何の知識もなくHaskellでコードを書いていると大域変数を引き回してしまうことが多々あり、非常にイライラします。Haskellで大域変数を実現したいときはReaderモナドを使えば良いようです。微妙にリファレンスが少なくてヤキモキしたので知見を並べていきます。 まずは公式リファレンス。 Control.Monad.Reader - Hackage 続いて定義。 newtype Reader e a = Reader { runReader :: e -> a } instance Monad (Reader r) where return a = Reader $ \_ -> a m >>= f = Reader $ \r -> runReader (f (runReader m r)) r 上を見ればわかるとおり、Readerというのは環境変数(e)を受け取って値を返す関数のことなので
実践編!Haskellらしいアプリケーション開発。まず型を定義すべし【第二言語としてのHaskell】 トランプを使った有名なゲーム「ブラックジャック」の手札の値を計算をするアプリケーションを書きながら、Haskellによるプログラミングの中心となる「型を定義し、その型を利用した関数を書く」ことを実践してみましょう。 こんにちは。Haskell-jpの山本悠滋(igrep)です。 Haskellでプログラミングを始めるのに最低限必要となるものを「Haskellらしさって?「型」と「関数」の基本を解説!」という記事でお話しました。 その際に「Haskellによるプログラミングの大きな部分を占めるのは、問題に合わせた型を自分で考えて定義し、その型を利用した関数を書くこと」 と宣言しましたが、実践するところまでは踏み込みんでいません。 この記事では、実際にアプリケーションの一部を書きながら、「型
今回は GHC 7.10 へ移行した場合にモナドのインスタンス化がどうなるのかについて簡単に書いておこうと思う。 GHC 7.8 のマニュアルでMonadの定義を見てみると、 となっており、Monad にするために最低必要なものは、(>>=) と return の定義、そして「モナド(3)」で説明した「モナド則」を満たしていることの確認、以上を行えばモナドになることができた。ところが、度々触れたように、GHC 7.10 からは Applicative を継承していなければモナドになれなくなってしまった。GHC 7.10.1 はまだリリースされていないが、RC21を使うことができるのでいくつか確認してみた。 GHC 7.10.1 のマニュアルを見てみると、 class Applicative m => Monad (m :: * -> *) where ・・・ class Functor f
Implementing a computer algebra system in Haskell José Romildo Malaquias a , Carlos Roberto Lopes b,* a Departamento de Computação, Universidade Federal de Ouro Preto, Ouro Preto, Brazil b Faculdade de Computação, Universidade Federal de Uberlândia, Uberlândia, Brazil Abstract There are basically two kinds of mathematical computation, numerical and symbolic. Numerical algorithms are usually
Stable Haskell package sets A distribution of compatible Haskell packages from Hackage that build together Stackage is a community project: how to add packages to Stackage stack makes using Stackage easy Latest releases per GHC version Stackage Nightly 2024-07-22 (ghc-9.8.2), a day ago LTS 22.30 for ghc-9.6.6, published 2 days ago LTS 22.27 for ghc-9.6.5, published 4 weeks ago LTS 22.20 for ghc-9.
4. 話すこと Haskellの型の仕組みと圏論の対応 Haskellの型システム 圏論の概念 型 対象 関数 射 tuple 直積 either 直和 Functor 関手 (ある種の関数) 自然変換 Haskellの型システムが圏論に支えられている実例を見ていきま す. Kinebuchi Tomohiko 圏とHaskellの型
Packages by categoryCategories: (5), "Distributed Computing" (1), - (1), .NET (9), Accelerate (27), Accessibility (4), ACME (55), Actors (2), Adjunctions (2), ADSB (5), Aerospace (11), Aeson (4), Agda (1), AI (82), Algebra (61), Algebra Uniform (1), Algorithm (9), Algorithm Visualization (2), Algorithmic Music Composition (1), Algorithms (137), Amazon (1), Amqp (1), Anatomy (1), Animation (6), AN
この記事の最新版は、githubで管理されています。 これはHaskell Advent Calendar 2012の5日目の記事です。 Haskellで作成したパッケージに対して、単体テストを書くための最新情報をお届けします。 要約 要点は4つです。 利用者に見せたい振る舞いは、doctest で書く 利用者に見せたくない振る舞いは、hspec で書く テストを自動化するフレームワークとしては Cabal を使う doctest でも hspec でも、純粋なコードに対しては、できるだけ QuickCheck などの性質テストを書く この記事で一番伝えたいのは、3) です。例題としては、Base64 という符号化を取り上げます。Base64 は知っていると仮定して話を進めますので、知らない人はあらかじめ Wikipedia の Base64 の説明でも読んで下さい。 この記事で利用するコ
前回のモナドの紹介に引き続き,今回は具体的なモナドの例について見ていきたいと思います。 とはいっても,今回はまだIOモナドは取り上げません。たしかに,HaskellのモナドはIOモナドを意識して作られているため,IOモナドについて説明したほうがしっくりくる部分もあります。 ただ,IOモナドはHaskellで使われている様々な技術を組み合わせたものになっています。いきなりIOモナドについて説明すると,どれがIOモナドの本質でどれがそうでないのかがわからなくなってしまいます。技術的な要請でしかないものを,IOモナドの性質と勘違いしてしまう危険性があるのです。 こうした問題を回避するには,基礎的なものから段々と積み重ねて理解していくのがよいでしょう。前回,コンテナが持つ値には「取り出し可能な値」と「取り出し不可能な値」があると説明しました。今回は,「取り出し可能な値」のみを持つコンテナであるLi
LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。Perl、Python、Ruby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事で二点ほど補足します。 Haskell では文法がうまく設計されており、コードを書けば自然とDSLっぽくなるので、わざわざ内部DSLなんて言わない。それよりもコンビネータという考え方を学ぶ方が新しい視野がひらけてよい。 Haskell ではパーサーを作るのが簡単。だから自分で言語を作るのも簡単。その言語を外部ファイルから読み込んでもいいし、HERE DOCUMENT のように内部に貼付けることもできる。 関数を二項演算子として扱う Haskell では関数をバッククォートで囲むと二項演算子になります。 i
Motivation It's relatively simple to write a program to approximate derivatives. We simply look at the limit definition of a derivative: $$ \frac{d}{dx} f(x) = \lim_{h \rightarrow 0} \frac{f(x+h) - f(x)}{h} $$ and choose some small decimal number to use for $h$ instead of calculating the limit of the function as it goes to $0$. Generally, this works pretty well. We get good approximations as lon
ベクトルや行列の計算を使ったシミュレーションの説明は比較的によく出会うので、Haskell ではどうしたら良いだろうかと考えた。ベクトルの加算や内積はリストの計算で簡単にできる。 vadd x y = zipWith (+) x y vdot x y = sum $ zipWith (*) x y しかし、行列の計算は二次元配列を使わずにどう計算したらよいのだろうと思案していた。たまたま、List モジュールの勉強をしていたら、行列の転置をおこなう transpose という関数があるのを知った。行列の積を計算するときに、答えの行列の要素は、被積算行列の横ベクトルと積算行列の縦ベクトルの内積であることを考えて、二次元配列を使わずにできるのではないかと思い立った。 そこで、やってみたら、できた。 mproduct x y = mktbl (length (head y)) [vdot v w
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く