Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「GHC」を含む日記RSS

はてなキーワード:GHCとは

2024-11-04

anond:20241103122345

2006.12.10 丸藤vs三沢 GHCチャンピオンとして格を上げつつあった丸藤が、団体象徴三沢と満を持して対決したカード。誰もがここで三沢が丸藤に格を渡して一線を退くものと思っていた。だが一進一退の攻防を繰り返したあと、最後三沢が丸藤から3カウントを奪う。この後、無理してチャンピオンを続けた三沢がどうなって、ノアがどうなってしまたかは御存知の通り。名プロレスラーメジャー団体運命を決めてしまった一戦。

Permalink |記事への反応(0) | 06:45

このエントリーをはてなブックマークに追加ツイートシェア

2022-01-04

anond:20220103200905

これを見て佐々木健介検索していたら元旦GHCヘビー級タイトルマッチ中嶋勝彦が潮崎にノーザンライトボムを出して勝利したことを知りうるっとくる

Permalink |記事への反応(0) | 10:37

このエントリーをはてなブックマークに追加ツイートシェア

2014-04-09

オブジェクト指向 v.s.関数型プログラミング

近年、関数型プログラミング重要はいろんなところで叫ばれています

Javaの最新バージョン関数型プログラミングに関する新機能が加わりました。

Rubyも昨今、関数型プログラミングへのサポートが手厚くなってきています

プログラミング教科書大手オライリーからJavascript関数型プログラミングを行うための解説書が発行されました。

関数型プログラミングへの注目度は高まってきています

おそらく、みなさんは既にオブジェクト指向が何か、を知っています

でも関数型プログラミングとは何か、胸を張って語れる人は、周りに見当たらないかと思います

実際、オブジェクト指向によってプログラミングする方法は、わかりやすい解説があちこちにある一方で、

関数型プログラミングとは何か、何が良いのか、ということについての、よいまとめは見つけることはできませんでした。

この記事を読む方の中で、「関数型プログラミングを取り入れるか・取り入れないか」で切実に悩んでいる人は、おそらくいないでしょう。

この記事はあまりかいところに立ち入りません。関数型プログラミングを使う側の立場に立って、利点や向き・不向き、それが導くスタイルを書きました。

みなさんは鳥のように飛んで、高い空から関数型プログラミングとは何か、何が良いのか、を見渡してください。

ふたつのアプローチ比較

オブジェクト指向アプローチは、名前をつけてプログラムを整理する

関数型プログラミングアプローチは、汎用部品でなんとかする

オブジェクト指向アプローチ

Googleが近年リリースした言語、Goには、”継承”を直接サポートする仕組みが無いことが話題になりました。

また、Mac OSXの基幹ライブラリCore Foundationは、ライブラリ自体C言語で書かれているにもかかわらず、その設計方針は明確にオブジェクト指向です。

継承クラスは、オブジェクト指向必須条件ではありません。

オブジェクト指向本質とは、何でしょうか。

その本質とは"名前をつけて対象を識別し、それを扱うこと"、にあります

最もプリミティブなオブジェクト指向対象は、ファイルハンドラです。あるファイルを開いて、読み込んで、あるいは書き込んで、ファイルを閉じる。

これらの処理をまとめたら、わかりやすいですよね?

対象に関する処理を、対象の周りにまとめる。これがオブジェクト指向の基礎的な理念です。

識別することとイコール比較できることは、とても良く似ています

イコールによる比較は、オブジェクト指向では鬼門であることが知られています

PointクラスインスタンスとColoredPointクラスイコール演算をどう決めればいいかに、正解はありません(詳しくは"effectivejava"をご参照ください)。

また名前をつけて識別する対象は、フワフワしていてはいけません。

たとえば、"軍人階級"をオブジェクトにしたとしましょう。"大佐"クラスのある兵士名前フィールドや、性別フィールドを持っているでしょう。

ところで彼が昇格したときに何が起こるでしょうか。

新たに"少将"クラスインスタンスが作られます。"大佐"クラスを破棄する前に、名前性別、その他沢山のデータを引き継がなくてはいけません。フィールドを増やしたい場合はその都度コード修正を加える必要があります(*)。

なるべくイコール比較を避けたい。対象不安定なものはいけない。では何に名前をつけて、識別するか。そこにオブジェクト指向技術者の熟練度が現れるのです。

関数型プログラミングアプローチ

一方、関数型プログラミングでは、特定の何かに名前をつけるより、極力、汎用部品でなんとかしようとしま

さな関数を、集めて撚り合わせて、新しい関数を作る。

関数自体リストなどのデータ構造に詰めることもよく行われます

実は、関数型プログラミングというのは本質を表していません。

その真の名は、"値指向プログラミング"です。

関数をはじめとして、リスト・ツリーのようなコンテナ手続きを抽象化したもの、回路を抽象化したもの

あらゆる対象を値として、合成し、ときに分解し、新しい値を作ります

変数という概念必要ありません。

変数適用する処理を作りあげることが、とても簡単だからです。

四則演算定義されたデータを詰めたデータ構造もまた、四則演算可能だったり。

値をイコール比較することも、なんのそのです。

誤解を恐れずに言うと、オブジェクト指向トップダウンなのに対し、関数型プログラミングボトムアップです。

関数型プログラミングの利点

読みやすい・理解やす

関数型プログラミングサポートする言語には、沢山の汎用部品定義されています

このような構造インターフェイスとして、様々なライブラリが組まれているので、

たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて、

パーサーを理解できれば、JSONパーサー・ XMLパーサー・markdownパーサー・C++パーサー ... などを理解するのはとても容易です。

理解やすいこと。これが関数型プログラミングの大きな利点です。

追記:

また、汎用部品と型のお陰で、ライブラリドキュメントが圧倒的にひきやすい、というメリットも有ります

Haskellな人がPythonにトライした結果 - Togetterまとめ

書きやす

関数型プログラミングは「厳密な事前設計必要とするため、簡単なことをやるのにも時間が掛かる」。

よく誤解されていますが、これはウソです。

スクラッチプログラムするのは、非常に手軽です。

>> map (*2) [1,2,3][2,4,6]

邪魔な”儀式”や、"おまじない"のコードが徹底的に撤廃されているためです。

関数型プログラミングコードは、潔癖かつ濃密です。

たとえばC言語でinthoge(int x,int y)が定義されているときhoge(3)はなんの意味も持ちませんが(コンパイルコケますが)、関数型プログラミングでは意味があり、実際に有用です。

上の例では、「掛け算をする」(*)関数は、二引数関数ですが、それに引数を渡して作られた「2を掛ける」関数(*2)は、一引数関数になります

関数型プログラミングでは、「簡単なことは簡単にでき、複雑なことは複雑にできる。ただし、間違ったことは殆どできないか、全くできない」。

多くのバグは、コンパイルエラーとして検出されます

また、静的型付けの力によって、コード補完は非常に強力になっていますインテリセンスの比ではないです。

たとえば、関数中のある表記の型を任意に表示できます(GHC/TypedHoles - HaskellWiki)。

やがてやってくる未来には、プログラムテキストエディタで書くことは時代遅れになっているでしょう。

統合環境サポートで、バグミスの少ない、スムーズプログラミングができます

そしてその環境で動くプログラミング言語は、関数型プログラミングサポートした言語なのです。

いつ関数型プログラミング

以下の様な兆候を感じたら、あなたはそのプログラム関数型プログラミングで書くべきです。

一般に、オブジェクト同士の相互作用が複雑になるほど、オブジェクト指向では手に負えなくなっていきます

そういうときは、オブジェクトを直接扱わず、替わりにその"相互作用"を扱うことで、複雑さを軽減するアプローチ有効です。

それこそが関数型プログラミングアプローチです。

オブジェクト指向の利点

初心者にとっては読みやすい・理解やす

特にオブジェクト指向有効なのはプログラミング初心者がそのコードをいじるかもしれないときです。

関数型プログラミングは、強固さと柔軟さの代償として、高い学習コストを伴います

そのため、初学者にとってはハードルが高いのです。

扱う対象があまり複雑でない時は、書きやす

オブジェクト間の相互作用が複雑でなく、着目している(名前をつけている)概念が安定しているとき

そして、プログラムをいじる人たちの間で共通理解が図れているならば、オブジェクト指向が有利です。

関数型プログラミングの得意分野はなにか

数値計算

遅延評価という機能によって、レガシー言語で扱えなかった、巨大な数を扱うことができます

分数を扱うことができます虚数もです。

関数型プログラミングで書かれたプログラムは、正確さが要求される、金融関連の業界で使われています

テキスト処理

手続きとしてパーサーを記述できるので、テキスト処理プログラムはより理解やすく、メンテナンスやすものになります

関数型プログラミングを知らない人は、「正規表現おk」と言いますが、

彼の書いた複雑な正規表現は、半年後には(書いた本人でさえ)理解できなくなっていることでしょう。

並行処理

手続き一般を扱うことができるので、途中で割り込みのある手続きの表現も容易です。

関数型プログラミングサポートしていない言語ではコルーチン(ファイバー)などをつかってなんとかするしかありません。

さもなくば、非並行処理では普通に関数として記述できるところを、並行処理のために、Builder,Strategy,Command,Interpreterパターンを駆使して書き直すことになります

Javascript使いの方は、Deferredなどの構造を使うでしょう(http://qiita.com/KDKTN/items/4c6986049d204f0645d8)。

C++使いの方はBoostで頑張りましょう。破滅的に解りにくいコンパイルエラーメッセージと格闘してください。

レシピ

もう少し簡単な例をあげます

あなたは、あるレシピにしたがって、自動的料理を行うマシン制御プログラムを書いているとしましょう。

料理レシピは、"手続き"ですよね?たとえば、カレー

1. まず玉ねぎを炒める。

2. 飴色になったら、肉を加えて炒める。

3.野菜を加える。

4. 水を加えて煮る。

5.スパイスを加える。

しかあなたはこの手続きを関数として表現できるでしょうか。

…できませんよね?何故ならば、各ステップの"間に"、マシンのロボアームの位置や動きを調整する処理が必要からです。

これをオブジェクト指向でやろうとすると、各ステップ副作用として、それらの処理を行うことになります

そうすると、マシンが二機に増えた時などの変更量は、絶望的なものになります

あるいは関数として表現するのを諦め、手順全体をDSL記述できるようにします。

このアプローチ関数型プログラミング的です。しか関数型プログラミングサポートした言語の助けなしでは、そのDSL記述するために沢山のユーティリティコードを書かなくてはならないでしょう。

オブジェクト指向アプローチでこの問題をエレガントに解こうとすると、クラス化の粒度を上げる事になります

野菜クラスフライパンクラス、ボイルクラスフライクラス、焼き加減クラス、アームクラス野菜の大きさクラス、切り方クラス、焼き方クラス、"焦げたよ"クラスetc...

こうすると早晩レシピプログラムコードから消え去ることになります。上記のたった5行は、依存性注入のオブジェクトグラフを構築するコードに取って代わることになります。そこには沢山の挙動制御オプションとして付記されているのです。

カレーなど、ある種のレシピ限定することで、見た目の理解やすさを得ることができますが、一方それは表現力を損なうことを意味します。

C言語などではマクロを使うこともできますが、それは結局、関数型プログラミングアプローチ意味するところと同じになります。すなわち、補助のために沢山のコードを書くことになるでしょう。

GUI

iOSのAppstoreアプリは、"無料"と書かれたボタンを押すと、それが"インストール"ボタンに変わり、それをもう一度押すと、ダウンロードの進捗を表すインジケータに変わり、それを押すとダウンロードキャンセルできます

このように、位置は同じなのに、ステートに依って見た目と機能が変わるボタンは複雑です。

これをオブジェクト指向で実現しようとすると、

1. 三つの異なるボタンを同じ位置に置くか

2. 同じボタンが三つの異なる機能を持つか

という下らない問題にぶつかります

一方関数型では、"機能"、"見た目"、"状態"、を独立に扱って、それらを合成してボタンを作るので、迷うことはありません。

「同じ位置にあるUIオブジェクトは、コード上で(インスタンスとして)独立して、他から干渉を受けない」

この条件が満たされているうちは、オブジェクト指向GUIを実現することに無理はありません。

しかし、携帯端末のような小さい画面で、多くの機能を達成するためには、UI要素はコンテキスト依存的に複雑になりがちです。

近年、PCのディスプレイの大きさは、頭打ちになってきました。

画素数は増えているのですが、MacにおけるRetinaのように、複数ピクセルひとつドットを表すようになってきています

これは、ひとつの画面に置かれるボタンなどのUI要素の数は、これから先の未来で増えることはない、ということを意味します。

したがって、未来GUIプログラミングは、注意深く機能ピックアップして制限するというデザイナー努力を脇におけば、

関数型プログラミングの力を頼るしか無いでしょう。

はじめよう、関数型プログラミング

まり

Haskellさいこうなのおおおおおおおおおおおおおおおおおお!! おしっこ漏れちゃうのおおおおおおおおおおおおおおおおおおおお(゜∀。)ワヒャヒャヒャヒャヒャヒャ

1.google:すごいHaskellたのしく学ぼう を注文する。

2.Download Haskell自分のPCに導入する。

3.コンソールghciと入力して、対話コンソールを立ち上げる。

4. 次の関数コンソールに打ち込んで、結果を見る。即値で書かれているところとかをいろいろ変更してみて、感動する。

take 4 $ map (*2) [1..]

5.ステップ1で買った教科書を読んで、学ぶ。


追記:

いかがでしたか

ちまたには、関数型プログラミングの利点は変数が無いことだ、とか、より安全から、とか、より速いから、などという妄言が満ち溢れています

オブジェクト指向関数型プログラミングは、水と油ではありません。プログラマ自分プログラムに最適なアプローチを選ぶことができます

一般にはあまり知られていないことですが、Haskellにもオブジェクト指向へのサポートがあるんです(Lensライブラリ、これを使用したサードパーティライブラリ最近増えてきています)。

この記事を読んだオブジェクト指向プログラマあなたが、少しでも関数型プログラミングに(そしてHaskell)興味を持ってくださって、ホームセンター大人用オシメのコーナーが大賑わいになれば幸いです。。

Permalink |記事への反応(8) | 01:08

このエントリーをはてなブックマークに追加ツイートシェア

2011-10-01

プログラム変換」の目次

第1章 プログラム変換入門 佐藤泰介1.1 今なぜプログラム変換か?1.2 変換あれこれ1.3システム化について第2章 等式プログラム等価変換 二木厚吉2.1等価変換例2.2等価性2.3等価変換法2.4 おわりに第3章 論理言語におけるプログラム変換 玉木久夫3.1 はじめに3.2論理プログラムとその意味論3.3 展開/たたみ込み変換:例題3.4 展開/たたみ込み変換の正当性3.5 他の変換との両立性3.6 おわりに第4章 部分計算 二村良彦4.1 はじめに4.2 部分計算概要4.3 部分計算の応用例4.4 部分計算理論4.5実用化のための課題第5章 メタプログラミングと部分計算 竹内彰一5.1 はじめに5.2Prologプログラムの部分計算5.3メタプログラミングへの応用5.4メタインタプリタの段階的特殊化5.5 おわりに第6章 合成問題への新しいアプローチ 佐藤泰介6.1 否定技法6.2 二重否定技法6.3論理プログラムの合成第7章 ベクトル化とプログラム変換 安村通晃7.1 はじめに7.2プログラム変換7.3ベクトル化7.4 主要変換7.5 基軸変換7.6 その他の変換7.7ベクトル化におけるプログラム変換の特徴7.8 おわりに第8章 GHCでのプログラム変換 吉川康一8.1 はじめに8.2 簡単な問題8.3フィルタプロセスの融合8.4プログラム変換の手順8.5電子回路シミュレータへの応用8.6 おわりに第9章 実用規模プログラムの変換試行事例 吉田紀彦9.1 はじめに9.2コンパイラの変換9.3プログラム変換の実用可能性9.4 おわりに

Permalink |記事への反応(0) | 08:51

このエントリーをはてなブックマークに追加ツイートシェア

2011-09-23

「続 新しいプログラミングパラダイム」の目次

第1章 並行プログラミングGHC (上田和紀)1.1 はじめに1.2ターゲットを明確にしよう1.3 はじめが大切1.4GHCが与える並行計算の枠組み1.4.1GHCにおける計算とは,外界との情報のやりとり(通信)である1.4.2計算を行う主体は,互いに,および外界と通信し合うプロセスの集まりである1.4.3プロセスは,停止するとは限らない1.4.4プロセスは,開いた系(open system)をモデル化する1.4.5情報とは変数と値との結付き(結合)のことである1.4.6プロセスは,結合の観測と生成を行う1.4.7プロセスは,書換え規則を用いて定義する1.4.8 通信は,プロセス間の共有変数を用いて行う1.4.9外貨も,プロセスとしてモデル化される1.4.10 通信は,非同期的である1.4.11プロセスのふるまいは,非決定的でありうる1.5 もう少し具体的なパラダイム1.5.1ストリームと双方向通信1.5.2 履歴のあるオブジェクト表現1.5.3データ駆動計算と要求駆動計算1.5.4 モジュラリティと差分プログラミング1.5.5プロセスによるデータ表現1.6歴史的背景と文献案内1.7 並行プログラミング効率1.8 まとめ第2章 様相論理テンポラル・プログラミング (桜川貴司)2.1 はじめに2.2 様相論理2.3 時制論理2.4 多世界モデル2.5 到達可能性と局所性2.6 純論理プログラミングへ向けて2.7 TemporalProlog2.8 RACCO2.9 実現2.10 まとめと参考文献案内第3章レコードプログラミング (横田一正)3.1 はじめに3.2レコードと述語の表現3.3レコード構造とφ-項3.3.1 φ-項の定義3.3.2 型の半順序と束3.3.3KBLLOGIN3.4 応用――データベース視点から3.4.1演繹データベース3.4.2レコードプログラミングデータベース3.4.3 いくつかの例3.5 まとめ3.6 文献案内第4章抽象データ型とOBJ2 (二木厚吉・中川 中)4.1 はじめに4.2抽象データ型と代数言語4.2.1抽象データ型4.2.2代数言語4.2.3 始代数4.2.4 項代数4.2.5 項書換えシステム4.3 OBJ24.3.1 OBJ2の基本構造4.3.2モジュールの参照方法4.3.3 混置関数記号4.3.4モジュールパラメータ化4.3.5パラメータ機構による高階関数記述4.3.6 順序ソート4.3.7属性つきパターンマッチング4.3.8 評価戦略の指定4.3.9モジュール表現4.4 おわりに第5章プログラム代数FP (富樫 敦)5.1 はじめに5.2プログラミングシステム FP5.2.1オブジェクト5.2.2 基本関数5.2.3プログラム構成子5.2.4関数定義5.2.5FPプログラミングスタイル5.3プログラム代数5.3.1プログラム代数則5.3.2代数則の証明5.3.3代数則とプログラム5.4ラムダ計算拡張5.4.1ラムダ式拡張5.4.2拡張されたラムダ計算の簡約規則5.4.3 そのほかのリスト操作演算子5.4.4 相互再帰定義式5.4.5ストリーム(無限リスト)処理5.5FPプログラム翻訳5.5.1オブジェクト翻訳5.5.2 基本関数翻訳5.5.3プログラム構成子の翻訳5.5.4 簡約規則を用いた代数則の検証5.6 おわりに第6章カテゴリカル・プログラミング (横内寛文)6.1 はじめに6.2 値からルフィズムへ6.3カテゴリカル・コンビネータ6.3.1ラムダ計算意味論6.3.2 モルフィズムによる意味論6.3.3カテゴリカル・コンビネータ理論CCL6.4関数型プログラミングへの応用6.4.1関数型プログラミング言語ML/O6.4.2 CCLの拡張6.4.3 CCLに基づいた処理系6.4.4公理系に基づいた最適化6.5 まとめ第7章最大公約数――普遍代数多項式イデアル自動証明におけるユークリッドの互除法 (外山芳人)7.1 はじめに7.2 完備化アルゴリズム7.2.1 グラス置換えパズル7.2.2 リダクションシステム7.2.3 完備なシステム7.2.4 完備化7.2.5パズルの答7.3普遍代数における完備化アルゴリズム7.3.1群論の語の問題7.3.2 群の公理の完備化7.3.3Knuth-Bendix完備化アルゴリズム7.4多項式イデアル理論における完備化アルゴリズム7.4.1ユークリッドの互除法7.4.2多項式イデアル7.4.3 Buchbergerアルゴリズム7.5 一階述語論理における完備化アルゴリズム7.5.1 レゾリューション法7.5.2 Hsiangのアイデア7.6 おわりに第8章 構成的プログラミング (林 晋)8.1 構成的プログラミング?8.2 型付きラムダ計算8.3論理としての型付きラムダ計算8.4 構成的プログラミングとは8.5 構成的プログラミングにおける再帰呼び出し8.6 おわりに:構成的プログラミング未来はあるか?第9章メタプログラミングリフレクション (田中二郎)9.1 はじめに9.2計算システム9.2.1因果結合システム9.2.2メタシステム9.2.3リフレクティブシステム9.3 3-Lisp9.4リフレクティブタワー9.5GHCにおけるリフレクション9.5.1 並列論理言語GHC9.5.2GHC言語仕様9.5.3GHCメタインタプリタ9.5.4リフレクティブ述語のインプリメント9.6 まとめ

Permalink |記事への反応(0) | 18:03

このエントリーをはてなブックマークに追加ツイートシェア

2007-07-22

http://anond.hatelabo.jp/20070722124636

「本当に専門的な知識なんてネット存在しないよ」というから「論文は専門的な知識じゃないの?」と言ったまでです。

http://anond.hatelabo.jp/20070722125013

本かぁ……。関数型言語コンパイラの実装について語った日本語の本をずっと探しているんだけど、ないんだよねぇ。発売される気配すらしない。

んで、仕方なく英語論文を紐解くわけだ。「GHCハッキングガイド」とか出たらマジで買う。

http://anond.hatelabo.jp/20070722125508

経験を得る為の指針として専門的な文献が必要なんです。

Permalink |記事への反応(0) | 13:05

このエントリーをはてなブックマークに追加ツイートシェア

2007-03-01

Haskell学習記録

Haskell学習記録(1)

匿名Haskell学習記録を黙々と残していこうと思う。

本日は、ひとまず、GHC(http://www.haskell.org/ghc/)のインストールと、

参考書(asin:4797336021)の購入に成功した。

明日から、サンプルコードとにらめっこしつつ頑張っていく予定。


p.s:ひとりだとさみしいので、ちょうどはじめようとしている人がいたら

一緒にやってくれると嬉しい。

Permalink |記事への反応(2) | 23:38

このエントリーをはてなブックマークに追加ツイートシェア

 
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp