実践編!Haskellらしいアプリケーション開発。まず型を定義すべし【第二言語としてのHaskell】トランプを使った有名なゲーム「ブラックジャック」の手札の値を計算をするアプリケーションを書きながら、Haskellによるプログラミングの中心となる「型を定義し、その型を利用した関数を書く」ことを実践してみましょう。 こんにちは。Haskell-jpの山本悠滋(igrep)です。 Haskellでプログラミングを始めるのに最低限必要となるものを「Haskellらしさって?「型」と「関数」の基本を解説!」という記事でお話しました。 その際に「Haskellによるプログラミングの大きな部分を占めるのは、問題に合わせた型を自分で考えて定義し、その型を利用した関数を書くこと」 と宣言しましたが、実践するところまでは踏み込みんでいません。 この記事では、実際にアプリケーションの一部を書きながら、「型

昨日のHaskellハンズオン でIOモナドを学びました。 アイデアがあったものの、イベント中に実装が間に合わなかったので改めて時間を取って実装をしてみました。 改良点すべき点は多いのですが、とりあえず動くようになったので公開してみます。 作ったもの英語学習用のCLIツール。 日本語に対応する英語を入力すると正解か不正解か、不正解の場合はそのDiffが表示される。GitHub - kuranari/ring-note 最近、瞬間英作文の書籍を使って英語の勉強をしているのですが、音読だと時制や単数・複数の扱いが曖昧なまま流してしまうので、コンソールで入力して正確な作文が出来ているのかチェックしてみることにしました。 紙に書くと時間がかかるので、キーボード入力がちょうどいいのではと思った次第です。 どんどん話すための瞬間英作文トレーニング (CD BOOK) 作者: 森沢洋介出版社/メーカ

なぜこれを書いたか 誰かHaskellしか関数型を知らない僕にElixirの特徴(特にHaskellとどう違うか)を教えて欲しいです#elixir— Tatsuki@Vim (@ttk_vim) 2017年5月22日 テクノさん案件だ— Haskell (@aiya_000) 2017年5月22日 オッス!オラ、テクノ—techno_tanoC📕 (@techno_tanoC) 2017年5月22日 案件が回ってきたので書きます。時間がないので雑な説明になります。雑すぎて公開するか悩みましたが、せっかくなので公開しておきます。先に謝っておきますごめんなさい。 自己紹介趣味でプログラミングをやっている(ruby,railsを2年ほど書いていたのは過去の話)人です。 現在の本業は薬学部生です。平日は実習で潰れるのでここ最近全くプログラミングをしていません。 関数型プログラミングが大好き
どうもHaskellには標準のControl.Exceptionモジュールだけでなくmtlやexceptionsやexceptionalといった例外を扱うためのパッケージがあるらしいのだが、そのあたりのパッケージの選び方や使い方についてまとまった情報を見つけられなかった。 HaskellWiki例外のページも少々古いようで、deprecatedなものや統合される前のパッケージを書いていたりする。 調べた限り、mtlとexceptionsが今の主流っぽい。 その2つの使い方をまとめる。 なおバージョンはlts-6.1を基準としている。 mtl mtlパッケージのControl.Monad.ExceptモジュールはMonadErrorというモナドとExceptTというモナド変換子を提供する。 以下のように使う。 import Control.Monad.Trans(lift) import C
この記事はIIJの@kazu_yamamotoさんの下で、アルバイトとして書いています。 最終的な目的はHaskellでの統計処理やデータ処理のツールを整備しようというものですが、その下調べをした内容をこの記事にまとめています。 ご意見などコメントいただけるとありがたいです。 今から3年前の2011年のICFPに、Emily G. Mitchell 氏のHaskellを使ったシミュレーションに関するExperienceReportが掲載されました。 [PDF] FunctionalProgramming through Deep Time - Modeling the first complex ecosystems on Earth このレポートでは筆者が行ったエディアカラ紀の生態系シミュレーションの実装に関してプログラミング言語の選択や、使った言語にどのような利点・欠点があったかが述

CodeforcesやProject Eulerの問題には、無限リストをうまく使うと綺麗に解くことができる問題がたくさんあります。 数列の性質から探索範囲の上界を決めて解を探索することが多いのですが、きちんとした根拠を持って上界を決めることができることは少なく、余裕を持って十分に広い範囲で計算して解を求める解法がよく取られます。 Haskellの特徴である遅延評価とその洗練された糖衣構文を用いると、無限リストを簡単に扱うことができます。 上界を適当に定める解法よりも、より宣言的で美しく、時に効率的なコードで同じ解を得ることができます。 しかし、無限リストをきちんと、それも無限個の無限リストをきちんと扱うとなると、意外と苦労します。 この記事では、無限個の無限リストをソートされた形で結合する方法について説明します。 一般的な無限リストではなく、条件はかなり絞っていてます (そうでないと原理的

こんにちは。インフラストラクチャ本部の竹辺(@beketa)です。 このエントリはGREE Advent Calendar 2013 12日目の記事です。 1. グリーでのHaskellプログラマ採用 Haskellを導入する企業が増えているようです。最近国内のメディアで紹介された事例だけでも Tsuru Capital様: http://itpro.nikkeibp.co.jp/article/Watcher/20131003/508622/NTTデータ様: http://itpro.nikkeibp.co.jp/article/NEWS/20131126/520642/ の複数があり、すっかり実用的なプログラミングとして定着した感があります。 弊社でも2012年の中ごろから複数のプロジェクトでHaskellを使い始めており、昨年からは一部の商用サービスでもHaskellで開発したミド

[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける! 第1章関数プログラミングは難しくない! ―初めて学ぶ人にも、挫折した人にもきちんとわかる マルチコア環境が身近になった影響からか、勉強熱心なプログラマの間で関数型言語が話題になっているようです。関数型言語が奨励する関数プログラミングでは、これまで命令型言語で習得した、命令プログラミングの再代入を使う技法があまり通用しません。そのため、「関数型言語は難しい」と言って途中で投げ出してしまう人も多いようです。 この特集では、関数プログラミングの習得を一度諦めてしまった人や、これから始める人のために、関数プログラミングのポイントをできるだけわかりやすく説明します。 筆者がわかるようになるまで 実は筆者も長い間、関数プログラミングを習得できませんでした。筆者は、長年Emacs Lispを使って、Mewというメールリーダーを開
関数型プログラミングにおいて、モナドはプログラムを構造化するための汎用的な抽象概念である。対応したプログラム言語では、ボイラープレート的なコードでもモナドを使って除去することが可能となる。これはモナドが、特定の形をした計算を表すデータ型と、それに関する生成と合成の2つの手続きを提供することによって実現されている。生成は任意の基本型の値をモナドに包んでモナド値を生成する手続きであり、合成はモナド値を返す関数(モナド関数)たちを合成する手続きである。[1] 広い範囲の問題をモナドを使うことで単純化できる。例えば、Maybeモナドを使えば未定義値への対処が簡単になり、Listモナドを使えばリストに入った値を柔軟に扱うことができる。複雑に組み合わさった関数は、モナドを使えば、補助データの管理や制御構造や副作用を除去した簡単なパイプライン構造に置き換えることができる[1][2]。 モナドの概念や用語
2015-08-09:この記事にはアップグレード版がありますblog.euphonictech.com この記事の入れ方は今は推奨しません。上記の新しい版を参照してください。 あけまして あけましておめでとうございます。5日はブログにまとめようと思っているオセロのAIの開発の方にかまけて更新が滞っております。 cabal hell! IntelliJでHaskellを書いているとだんだんと動作がおかしくなってきて、cabal sandbox delete -> cabal sandbox initしてコマンドラインでcabalbuildする回数が多くなってきます。ついにghc-modiが動かなくなってIntelliJ上で型が表示されなくなり…詰みです。 これはcabal hellと呼ばれる現象でぐっちゃぐっちゃになった依存関係の成れの果てです。ぐちゃぐちゃの程度は色々あるでしょうが、動
例によってお酒を飲みながら書いているので文章が冗長です。御託はいいって人は本題まで飛ばしましょう。 枕っていうか前置き プログラミング言語選択の理由というのは結局のところライブラリだったり環境にインストールされてるのがそれしかなかったりとか、言語自体がどうこうというのとは関係ない部分で決まったりして。 だからメジャーな言語はひと通りやってると意外な時に役に立ったりすることもあります。Perl,PHP,Ruby,Pythonあたりは2つ3つくらい覚えておくとなにかの役に立つかも。いや「何かの役に立つかも」ってレベルですが、少なくとも私は運が良いのか悪いのか、役立つシーンに遭遇したことがある。 で、 私は最近趣味でプログラミングする時はネットワーク環境が無いところでやる事が多いんです。適当にそこら辺のカフェとかで遊んでいるし、モバイルルータとかも持ってないし。 外で開発してて困ることと言
関数型言語テイスティング: Haskell,Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
こんにちは!インフラストラクチャ本部の橋本です。 このエントリはGREE Advent Calendar 2014 12日目の記事です。 読者のみなさまの一助となる知見が少しでも提供できれば幸いです。 はじめに HaskellのO/RマッパーであるPersistentのZooKeeperバックエンドを開発しました。 Persistentのいいところは以下のようになります。 HaskellのデータとDBのデータの変換が自動(O/Rマッパなので当たり前ですね。) 型安全に加えて、構造的に安定(DB["user"]とか文字列でDBから値をとってくることはできません。クエリでも同様です。) コネクションがプールされますSQLだけでなくNoSQLも扱えます よく使われています(Yesodのフレームワークに組み込まれていることが大きいと思います。) 開発の動機は、以下の通りです。GreeではKV

あなたのHaskellプログラムを速くするのにあたって、鍵となる道具はGHCのプロファイル機能である。これは別途第5章. プロファイルを取るで説明されている。プログラムが時間/空間をどこで使っているのかについて実際のこと(あなたがどんな風に想像しているかではなくて)を知ることにおいて、プロファイルを取ることに代わるものは存在しない。 もう一つ銘記すべきことだが、プログラムの性能を劇的に向上させるための圧倒的に良い方法は、より良いアルゴリズムを使うことである。プロファイルによってどこが時間を食っているかが分かったら、下に書いてあるもろもろの調整を試みる前に、プログラムについて再考した方が良いだろう。 プログラムを速くするためのもう一つの極めて効率的な方法は、誰か別の人によって真剣に調整されたライブラリコードを使うことである。Data.Listにあるのよりも良いクイックソートを書くことはできる
Haskellで速いコードを書くためのヒントを無秩序に集積したもの。環境としてはGHCを想定する。私は高速化について詳しい訳ではないが、思い付いたことはなんでもかんでも書くように心がけたので、運が良ければ何か役に立つ情報があるかもしれない。 並列処理のパフォーマンスについてはこの文章では触れない。まったく経験がないので。同じ理由で、浮動小数点数を多用した数値計算コードの効率化と、書き換え規則を多用する高水準の最適化も扱わない。 お願い: 文中に間違いや分かりにくい部分があれば指摘いただけると有難いです。また、他に載せた方が良さそうな最適化テクニックや、その他の改善提案があれば教えてください。掲示板またはメールまたはTwitter(@mkotha)までお願いします。 目次 基本的なこと 遅延評価の計算量見積もりの方法と、GHCの内部に依存しないテクニック集。入門書を読んだけれども、Haske
これはElm Advent Calendar 2014の3日目です。ElmはHaskellベースの言語なので、Haskellの記事や入門書もElmの学習に使えます。しかし、実はElmにはチョコチョコHaskellと違うところがあって互換性はありません。 相違点をElm公式サイトLearnの SyntaxとFAQから抜粋して解説します。 1.Elmは遅延評価ではありません Haskellは遅延評価なのでリスト処理の効率が良いのがウリでした。JavaScriptにもジェネレータという形で遅延評価の思想が取り入れられています。 しかし、Elmのリストや辞書等などは遅延評価ではありません。Elmはクライアントサイドの言語なので、遅延評価があまり役立たないこと、 SignalがJavaScriptのジェネレータのような機能を持っているためのようです。 2.Elmにモナドはありません Sig

46 5 2005 5 564 n 1 4 4 -1 5 n data data DumbTree =Empty | Fork DumbTree DumbTree data DumbTreeEmpty ( ) 2 DumbTree Fork nobsun@sampou.org IPSJ Magazine Vol.46 No.5 May 2005 565 DumbTree ( )Empty Fork ( ) -- trees (>0)DumbTree trees :: Int -> [DumbTree] trees 1 = [Empty] trees n = concat [joins ls rs | (ls,rs) <- [ lrs xs ys | (xs,ys) <- splits1 n ]] -- splits1 (>0)(>0)2 splits1 :: Int -> [(In
この手紙は、”熟練者”ならではの知識を語るものではありません。新人かベテランかに関わらず、私たちの誰もが繰り返し学び、覚えておくべきことについて書いています。ここでは、一般的な傾向や、聞けばなるほどと思うような傾向、重要とされていることを新たに学んで興奮している時に見られる傾向を紹介します。また、学んだことの面白さや重要性を人にきちんと伝わるように話すことの難しさについてもお伝えします。この手紙はかなり具体的に書いています。一般的な話をするなら具体的なことも併せて話さなければ理解してもらえないと悟ったからです。これは代数的構造やその他の抽象的な概念についても言えることですね。この手紙には、私が頭に入れておきたい、また皆さんに共有したいアドバイスが詰まっています。インターネット上で適切とは言えない振る舞いをしている人に出くわした時、そんなことはめったにないでしょうが、そんな時に思い出したい内

リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く