タグ付けされた質問 「haskell」

関数型プログラミング言語

6
Haskell型システムをこれほどまでに尊敬する理由は何ですか(たとえば、Java)。
私はHaskellを学び始めています。私は非常に新しいので、基本的な構成を理解するために、オンラインブックを数冊読んでいます。 よく知っている「ミーム」の1つは、「コンパイルすれば機能します*」というもの全体です。これは型システムの強さに関係していると思います。 この点で、Haskellが他の静的に型付けされた言語より正確に優れている理由を理解しようとしています。 別の言い方をすれば、Javaでは、ArrayList<String>()実際にあるべきものを含めるために、埋めるような凶悪なことを行うことができると思い ますArrayList<Animal>()。ここでは凶悪な事はあなたがいることであるstring含まれているelephant, giraffeなどと、誰かが中に入れた場合Mercedes-あなたのコンパイラは、あなたを助けにはなりません。 私は場合はやったんArrayList<Animal>()私は私のプログラムは、それが車についてです、動物については本当にないことにした場合、時間内にいくつかの後の時点で、その後、私は、たとえば、生産機能に変更することができますArrayList<Animal>生成することをArrayList<Vehicle>、私のIDEがどこでも私に教えてくださいコンパイルの中断です。 私の推測では、これは人々が強力な型システムによって意味するものですが、Haskellの方が優れている理由は私には明らかではありません。別の言い方をすれば、良いJavaまたは悪いJavaを書くことができます。Haskellでも同じことができると思います(つまり、実際にファーストクラスのデータ型であるはずの文字列/ intに詰め込みます)。 重要/基本的なものが不足していると思われます。 私のやり方の間違いを見せていただければ幸いです!

2
「Free Monad + Interpreter」パターンとは何ですか?
特にデータアクセスのコンテキストで、Interpreterを使用してFree Monadについて話している人々を見てきました。このパターンは何ですか?いつ使用したいですか?どのように機能し、どのように実装しますか? (このような投稿から)私はそれがモデルをデータアクセスから分離することだと理解しています。よく知られているリポジトリパターンとの違いは何ですか?彼らは同じ動機を持っているように見えます。

4
Haskellの型システムはJavaの型システムと形式的に同等ですか?[閉まっている]
ある言語では他の言語よりも簡単/難しいこともありますが、興味があるのは、ある言語では可能で、別の言語では不可能/無関係なタイプ関連の機能だけです。より具体的にするために、Haskell型の拡張機能を無視しましょう。あらゆる種類のクレイジー/クールなことを行うものが非常に多くあるからです。

4
矢印の目的は何ですか?
私はHaskellを使って関数型プログラミングを学んでいますが、なぜそれらが必要なのかを最初に理解して概念をつかもうとしています。 関数型プログラミング言語における矢印の目標を知りたいです。彼らはどのような問題を解決しますか?http://en.wikibooks.org/wiki/Haskell/Understanding_arrowsおよびhttp://www.cse.chalmers.se/~rjmh/afp-arrows.pdfを確認しました。私が理解しているのは、それらが計算用のグラフを記述するために使用され、より簡単なポイントフリースタイルのコーディングを可能にすることです。 この記事では、一般に、ポイントフリースタイルの方が理解しやすく、書きやすいと想定しています。これは非常に主観的なようです。別の記事(http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial#Hangman:_Main_program)では、絞首刑執行人のゲームが実装されていますが、この実装が矢印によってどのように自然になるかはわかりません。 コンセプトを説明する論文はたくさんありましたが、その動機については何も見つかりませんでした。 私は何が欠けていますか?

7
C#またはJavaのような言語で代数データ型をどのようにエンコードしますか?
代数データ型で簡単に解決できる問題がいくつかあります。たとえば、リスト型は次のように簡潔に表現できます。 data ConsList a = Empty | ConsCell a (ConsList a) consmap f Empty = Empty consmap f (ConsCell a b) = ConsCell (f a) (consmap f b) l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty)) consmap (+1) l この特定の例はHaskellにありますが、代数データ型をネイティブにサポートする他の言語でも同様です。 OOスタイルのサブタイプへの明らかなマッピングがあることがわかります。データ型は抽象基本クラスになり、すべてのデータコンストラクターは具体的なサブクラスになります。Scalaの例を次に示します。 sealed abstract class ConsList[+T] { def map[U](f: T …

1
Haskellまたは他の関数型プログラミング言語でプログラムをどのように設計しますか?
私はc#やrubyなどのオブジェクト指向プログラミング言語の経験があります。オブジェクト指向スタイルでプログラムを設計する方法、クラスとオブジェクトを作成する方法、およびそれらの間の関係を定義する方法を知っています。いくつかのデザインパターンも知っています。 人々はどのように機能的なプログラムを書くのですか?どうやって始めますか?関数型言語の設計パターンはありますか?極端なプログラミングやアジャイル開発などの方法論は関数型言語に適用できますか?

5
Haskellに欠点や問題はありますか?
次の(比較的些細な)個人プロジェクトのためにHaskellに飛び込むことを検討しています。Haskellに取り組んでいる理由は次のとおりです。 純粋に機能的な言語に頭を悩ます 速度。これは議論の余地があると確信していますが、私はHaskellがC ++に近い(そしてErlangよりもかなり高速であるように見える)ことをプロファイリングしています。 速度。Warp Webサーバーは、他のほとんどすべてと比較して非常に高速です。 したがって、これを考えると、私が探しているのは、Haskellに付随する欠点または問題です。WebにはHaskellが良いものである理由に関する膨大な情報がありますが、そのい側面に関するトピックはあまり見当たりません(構文についての不満はまったく気にしません)。 私が探しているものの例は、PythonのGILのようなものです。CPython環境で並行性の使用を実際に検討し始めるまで、頭を悩ませなかった何か。
47 haskell 

5
IOモナドが世界で動作する状態モナドと見なされているという批判
IOHaskellではモナドは、多くの場合、状態は世界でStateモナドとして説明します。したがって、IO aモナド型の値はのようなものと見なされますworldState -> (a, worldState)。 しばらく前に、私はこの見解を批判し、それが正しくない理由をいくつか示した記事(またはブログ/メーリングリストの投稿)を読みました。しかし、記事も理由も思い出せません。誰もが知っていますか? 編集:記事は失われたようですので、ここからさまざまな議論を集めましょう。 私は物事をより面白くするための賞金を始めています。 編集:私が探していた記事は、厄介な部隊への取り組みです:サイモンペイトンジョーンズによるHaskellでのモナド入力/出力、同時実行、例外、および外国語呼び出し。(TacTicsの回答に感謝します。)

2
なぜ実存型は関数型プログラミングの悪い習慣と見なされているのですか(または、そうでないのですか)?
一貫してコードをリファクタリングして存在型への依存を排除​​するために使用できるテクニックは何ですか?通常、これらは、あなたのタイプの望ましくない構造を不適格にし、特定のタイプに関する最小限の知識で消費を許可するために使用されます(または私の理解もそうです)。 誰もがいくつかの利点を維持しているコードのこれらへの依存を削除するためのシンプルで一貫した方法を考え出しましたか?または、少なくとも、変更に対処するために重要なコードチャーンを必要とせずにそれらを削除できる抽象化をすり抜ける方法はありますか? 存在タイプの詳細については、こちらをご覧ください(「あえて」。)。

3
LISPとHaskellを使用する利点は何ですか?彼らは私をより良いプログラマにしてくれるでしょうか?[閉まっている]
LispとHaskellはそれぞれ論理プログラミング言語と関数型プログラミング言語であることは知っていますが、これはどういう意味ですか?他の言語とどのように違いますか?これらを学ぶことはあなたをより良いプログラマにし、ロジックを改善すると聞いたことがあります。これは本当ですか?LispまたはHaskellを有能なレベルに習得すると、プログラミングが改善され、どの言語でも問題を処理できるようになりますか?それらが学習の努力に値するかどうかを知りたいだけです。また、これらの言語はGUIやグラフィックスなどの分野で役立ちますか、それともコンソールアプリケーションだけで役立ちますか?
41 haskell  lisp 

7
Haskell AND Lisp vs. Haskell OR Lisp [終了]
現在、C、C ++、およびPythonを使用してコーディングしています。関数型プログラミング言語を使いたいと思っていますが、今はHaskellに傾倒しています。ここで「Haskell vs Lisp」戦争を始めたくありません。私が知りたいのはこれです:主に関数型プログラミングに触れるためにHaskellを学んだ場合、後でLispを学ぶことでどんな利益が得られますか?

2
純粋に機能的な言語についての誤解はありますか?
私はしばしば次のステートメント/引数に遭遇します: 純粋な関数型プログラミング言語では副作用がありません(したがって、実用的なプログラムは副作用を持っているため、実際にはほとんど役に立ちません。たとえば、外部の世界と対話するときです)。 純粋な関数型プログラミング言語では、状態を維持するプログラムを作成できません(多くのアプリケーションでは状態が必要なため、プログラミングが非常に厄介になります)。 私は関数型言語の専門家ではありませんが、これまでこれらのトピックについて理解してきたことを以下に示します。 ポイント1に関しては、純粋に機能的な言語で環境と対話できますが、副作用を引き起こすコード(関数)を明示的にマークする必要があります(たとえば、モナド型によるHaskellで)。また、私が知っている限り、副作用による計算(データの破壊的な更新)も(モナド型を使用して)可能であるべきです(たとえそれが好ましい作業方法ではないとしても) ポイント2については、いくつかの計算ステップ(Haskellでもモナド型を使用)で値をスレッド化することで状態を表すことができますが、これを行う実際的な経験はなく、私の理解はかなりあいまいです。 それで、上記の2つの文は何らかの意味で正しいのですか、それとも純粋に機能的な言語に関する誤解ですか?それらが誤解である場合、どのようにして生じたのですか?(1)副作用を実装し、(2)状態で計算を実装するHaskellの慣用的な方法を示す(おそらく小さな)コードスニペットを記述できますか?

2
現代の言語はまだパーサージェネレーターを使用していますか?
これが出てきたとき、私はここウィキペディアで gccコンパイラスイートについて調査していました: GCCはBisonで生成されたLALRパーサーの使用を開始しましたが、徐々に手書きの再帰パーサーに切り替えました。2004年のC ++、および2006年のCおよびObjective-Cの場合。現在、すべてのフロントエンドは手書きの再帰下降パーサーを使用しています。 最後の文で(そしてウィキペディアを信頼する限り)私は間違いなく「C(gcc)、C ++(g ++)、Objective-C、Objective-C ++、Fortran(gfortran)、Java(gcj)、 Ada(GNAT)、Go(gccgo)、Pascal(gpc)、... Mercury、Modula-2、Modula-3、PL / I、D(gdc)、およびVHDL(ghdl)」はすべてフロントエンドであり、パーサージェネレーターを長く使用します。つまり、それらはすべて手書きのパーサーを使用します。 私の質問は、このプラクティスはどこにでもあるのですか?特に、[Python、Swift、Ruby、Java、Scala、ML、Haskell]のxの「xの標準/公式実装には手書きパーサーがありますか」に対する正確な答えを探していますか?(実際、他の言語に関する情報もここで歓迎されています。)掘り下げた後、私は自分でこれを見つけることができると確信しています。しかし、これはコミュニティによって簡単に答えられると確信しています。ありがとう!

5
「証明はプログラムです。それが証明する式はプログラムの型です」
これは哲学的な質問かもしれませんが、客観的な答えがあると思います。 Haskellに関するウィキペディアの記事を読むと、次のことがわかります。 この言語は、「証明はプログラムであり、それが証明する式はプログラムの型である」というHaskell Curryと彼の知的子孫の観察に根ざしています 今、私が尋ねているのは、これはほとんどすべてのプログラミング言語に本当に当てはまるのですか?Haskellのどの機能(または機能セット)がこのステートメントに準拠していますか?言い換えれば、この声明が言語の設計に影響した顕著な方法は何ですか?
37 haskell 

7
命令的なbreakステートメントと他のループチェックの機能的に同等なものは何ですか?
私が以下のロジックを持っているとしましょう。関数型プログラミングでそれを書く方法は? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } ほとんどのブログ、記事の例では、単純な数学関数「Sum」の単純な例を説明しています。しかし、私は上記のようなJavaで書かれたロジックを持っているので、それをClojureの機能コードに移行したいと思っています。FPで上記を実行できない場合、FPのプロモーションの種類はこれを明示しません。 上記のコードは完全に必須であることを知っています。将来的にFPに移行するという先入観に基づいて書かれたものではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.