web-dev-qa-db-ja.com

現実世界で関数型プログラミングを使用するにはどうすればよいですか?

関数型言語は、状態を排除することでバグを回避するだけでなく、スレッド数を気にせずに自動的に簡単に並列化できるため、優れています。

ただし、Win32開発者として、アプリケーションの一部のdllにHaskellを使用できますか?もしそうなら、私にとって自動的に得られる本当の利点はありますか?もしそうなら、何がこの利点を私に与えますか、コンパイラー?

F#は、複数のコアとCPUで作成した関数を自動的に並列化しますか?タスクマネージャーのスレッド数が増加するのを見るでしょうか?

基本的に私の質問は、どのようにしてHaskellを実用的な方法で使い始めることができますか。

102
Brian R. Bondy

本「Real World Haskell」はまさにあなたが探しているもののようです。オンラインで無料で読むことができます:

http://book.realworldhaskell.org/

41
Apocalisp

F#には、さまざまなCPUまたはマシンに機能を渡す魔法の妖精の塵が含まれていません。 F#/ Haskellおよびその他の関数型プログラミング言語が行うことは、作成されたスレッドまたはCPUに関係なく処理できる関数を簡単に作成できるようにすることです。

私が参加しているポッドキャストへのリンクをここに投稿するのは適切ではないと思いますが、Mad Podwysockiと話したHerding Codeのエピソードで同じ質問をし、彼はいくつかの興味深い答えを出しました。そのエピソードには、関数型プログラミングに関連する優れたリンクも多数あります。 1つのリンクタイトル「 Why Functional Programming Matters 」が見つかりました。

25
ScottKoon

これも興味深いかもしれません: " Real World Functional Programming "

例はF#とC#にありますが、理論はかなり一般的です。私が読んだもの(プレリリース)からそれは間違いなく面白いですが、これまでのところ、Parallel Extensionsのようなライブラリを使用して、C#にもっと固執したいと思っています。

14
Marc Gravell

あなたは言及しなかったが、私はあなたがC++を使用していると仮定している。機能的になる可能性のある簡単な方法の1つは、C++/CLI to F#を使用することです。 C++には、「マジックピクシーダスト」(IJW:It Just Worksと呼ばれる)が含まれており、マネージコードを呼び出したり、呼び出したりすることができます。これにより、F#コードの呼び出しは、C#からの呼び出しとほぼ同じくらい簡単です。

これを1つのプログラム(FreeSWITCH)で使用しました。これは完全にC/C++で書かれています。単一のマネージC++/CLI(/ clrスイッチを使用)を使用すると、魔法のようにマネージコードに移行し、そこからF#プラグインを読み込んで実行できます。展開をさらに簡単にするために、F#はすべての依存関係を静的にリンクできるため、F#ランタイムファイルを展開する必要はありません。 CLRコードを魅力的にするもう1つの点は、マネージコード(デリゲート)をCコードに渡すことができ、ランタイムが自動的にサンクを作成することです。

Haskellの方法を選択する場合、探している機能はFFI:Foreign Function Interfaceです。ただし、C#/ CLI with F#と同じレベルの統合を提供するとは思わない。

8
MichaelGG

私は現在、自分でHaskellを学んでいます。学習を始めたとき、C#のような言語を学ぶようなものではなく、まったく新しい世界であるため、あまり興味をそそられないように見えます。ほんの数行のコードで表現しました。コードを振り返ると、はるかに簡潔で、小さくタイトでした。私は絶対にそれを愛しています!実際、他のほとんどの言語が許可するよりも小さく、保守が容易で、はるかに複雑な実世界のプログラムを書くことができます。

幸運を。

6
Rayne

あなたはWin32とDLLについて言及しているので、私はあなたがアンマネージコードで作業していると思います。その場合、GHCは非常にうまく機能します。昨年末、Windowsで [〜#〜] ffi [〜#〜] を使用してDDEサーバーを作成し、MS DDEライブラリと通信しました。驚くべきことに、非常に楽しい体験でした(特に私はUnixの男です)。 HaskellのFFIは強力であり(たとえば、Cまたは他のライブラリからHaskell関数へのコールバックをサポートすることさえあります)、Cレベルコードを記述するときにHaskellの型チェックを行うことは夢のようです。

最後の点は、Haskellの主な利点の1つです。型システムは驚くべきものです。とはいえ、それは強力なツールのようなものです。それをうまく利用するには時間と労力が必要です。

はい、そうです、Haskellで残りのコードにリンクする小さなコードを書くことから始めることができます(他のコードにリンクする小さなHaskellプログラムから始める方が簡単かもしれませんが)、それは使う価値がありますこれについてかなりの時間を学び、できる限りそれを使用します。 HaskellでWindowsコード(私の場合は、洗練されたExcelアドイン)と緊密に統合されたかなり大きなプロジェクトを計画して、あなたは私のようになるかもしれません。

4
cjs