タグ付けされた質問 「functional-programming」

関数型プログラミングは、抽象化を構築し、コンピュータプログラムを構成する計算を表現するための手段として主に関数を使用するプログラミングパラダイムです。

2
線形論理のカリーハワードアナログとは何ですか?
ウィキペディアで定義されているように、 (カリーハワード対応)は、アメリカの数学者ハスケルカリーと論理学者ウィリアムアルビンハワードによって最初に発見された、形式論理と計算計算のシステム間の構文アナロジーの一般化です。 これに関連するのはλキューブです。これは、単純なタイプから構成の微積分への可能な洗練の軸のグラフィカルな表現であり、論理的な解釈があります。 私の知る限り、カリーハワード対応は、型理論と古典論理の関係です。私の質問は、型システムと線形論理の間にアナログの対応があるかどうかです。

1
単純に型付けされた組み合わせロジック?
型付けされていないラムダ計算と単純に型付けされたラムダ計算(たとえば、ベンジャミンピアースの本のタイプとプログラミング言語で説明されている)があるので、単純に型付けされた組み合わせロジックはありますか? たとえば、コンビネータS、K、およびIの自然な型は、 S : (a -> b -> c) -> (a -> b) -> a -> c K : a -> b -> a I : a -> a ここで、a、b、およびcは、タイプTのいくつかのセットにわたるタイプ変数です。ここで、おそらく単一の基本タイプBoolから始めることができます。タイプTのセットは、3つのパターンを使用して形成できるタイプと一緒にBoolになります。 (a -> b -> c) -> (a -> b) -> a -> c a -> b -> a a -> …

2
関数型論理プログラミングのカプセル化検索における最新技術とは何ですか?
カプセル化された検索が評価の順序に依存する可能性がある問題の解決策に特に興味があります。 [1]によると、PAKCSでのカプセル化された検索は評価の順序に依存しますが、MCCではそうではありませんが、それを使用するにはコンパイラーの実装に関する知識が必要であり、Curry言語仕様に従っていません。これは2007年に書かれたため、もちろん現在は古くなっている可能性があります。 KiCS2はIOモナドでカプセル化された検索の結果を返しますが、理由はわかりません。 [1]Braßeland Huch、関数型プログラミングと論理プログラミングのより緊密な統合について、Proc。APLAS 2007

4
「仮説」とはどういう意味ですか?
関数の引数が仮引数と呼ばれているのはどういう意味ですか?私はこの用語をFortran以外で使用したことはありませんが、コンピューターサイエンスの一般用語ですか?ダミーとして渡され、ダミーとして渡されない引数の例は何ですか? 私はこの定義を見つけましたが、わかりませんが、仮引数は参照によって渡される変数のようです。この場合、Fortranではすべての変数がダミー変数ですか?(混乱) 編集:私は次のエッセイに出くわしただけで、Fortranの引数/関数呼び出しのテモノロジーをよりよく理解するのに役立ちました:Dortor Fortran:引数のためにここに来ました

3
ポリモーフィックリストからポリモーフィックリストへのML関数
私はML(OCaml)でプログラミングを学んでいます。以前に、タイプのML関数'a -> 'bについて質問しました。今、私はタイプの関数で少し実験しています'a list -> 'b list。明らかな簡単な例がいくつかあります。 let rec loop l = loop l let return_empty l = [] let rec loop_if_not_empty = function [] -> [] | l -> loop_if_not_empty l (ライブラリ関数を使用せずに)空のリストまたはループを返す以外のことを行う関数を作成する方法がわかりません。これはできますか?空でないリストを返す方法はありますか? 編集:はい、私がtypeの関数を持っている場合は、'a -> 'b別の関数またはtypeの関数を作成できますが'a list -> 'b list、ここで私が疑問に思っているのは、最初の関数を作成する方法です。

2
関数型プログラミングは、変装した命令型プログラミングではありませんか?
私が見ていたYouTubeビデオでは、命令型プログラミングと関数型プログラミングの違いについて、JavaとHaskellでそれぞれ1to からtoまでの数を10合計する方法を説明することで説明しました。 Javaでは、各ステップを明示的に記述し、各ステップの結果を変数に割り当てる必要があります-次のようなもの int total = 0; for (int i = 1; i <= 10; i++){ total = total + i; } return total; Haskellでは、次のように簡単に言うことができます。 sum(1..10) 私の質問は次のとおりです。関数型言語のバックグラウンドで何かが起こっていることは明らかであり、その何かはある種の命令型プロセスでなければなりません。関数型言語は、実際には一種の命令型言語のAPIのようです。たとえばsum(int start, int end)、Javaでメソッドを定義することにより、関数型言語の一部を作成できます。私は本当に新しいタイプの言語をすぐに作成しましたか、それとも命令命令をユーザーから隠す一連の命令メソッド呼び出しを定義しただけですか? 私が理解するのに苦労していることがはっきりしているといいのですが。


1
関数型言語のリテラルは、空の型の関数と考えることができますか?
少し前に、私はスタックオーバーフローについて考えました。誰かがHaskellリテラルは何も操作しない関数と考えることができると言うのを見ました。これは私には理にかなっていますが、誰かが彼に激しく反対していることを覚えています。 私が正しく理解していれば、プリミティブ型のすべての値、または少なくともの値Boolは型コンストラクターであり、型コンストラクターは型への特殊な種類の関数です。以下のような値があるので2.87、Trueまたは、'f'それらに渡されたパラメータを持っていない、それは彼らのタイプにあなたがちょうど彼らのタイプの要素または何も含まないタイプの関数と考えるかどうか、言語の意味論に影響を与えないだろうように思えますそれは常にそれらの値を返します。このようにリテラルを考えることに問題はありますか?

2
明示的なアプリケーションまたはサブタイプなしの上位の多態性?
したがって、言語でより高いランクのポリモーフィズムを持つ2つの主な戦略に精通しています。 System-Fスタイルのポリモーフィズム。関数は明示的に型指定され、インスタンス化は型アプリケーションを通じて明示的に行われます。これらのシステムは命令的である場合があります。 サブタイピングベースのポリモーフィズム。ポリモーフィックタイプは、そのすべてのインスタンス化のサブタイプです。決定可能なサブタイピングを行うには、ポリモーフィズムが予測的でなければなりません。このペーパーでは、そのようなシステムの例を示します。 ただし、Haskellのような一部の言語では、明示的な型アプリケーションを使用せずに、命令的に高いランクの多態性を持っています。 これはどのようにして可能ですか?明示的なインスタンス化またはキャストなしで、サブタイプの概念なしで型をインスタンス化する場合、型チェックは「知る」ことができますか? または、そのようなシステムではタイプチェックは決定可能ですか?これは、Haskellのような言語が、ほとんどの人のユースケースでうまく機能する決定不能なものを実装するケースですか? 編集: 明確にするために、私は多態的に型付けされた値の定義ではなく使用に興味があります。 たとえば、次のように仮定します。 f : forall a . a -> a g : (forall a . a -> a) -> Int val = (g f, f True, f 'a') f引数として与えられたときではなく、それが適用されたときにインスタンス化する必要があることをどのようにして知ることができますか? または、関数型から自分自身を分離するには: f : forall a . a g : (forall a . a) -> …

2
なぜ教会でエンコードされたタイプでは帰納的証明を表現するのに十分ではないのですか?
帰納的型のない構造の計算は、帰納法によって証明を表現するのに十分強力ではないという主張を聞いたことがあります。あれは正しいですか?もしそうなら、なぜそれを教会エンコーディングは十分ではないのですか?

2
静的型チェッカーなしの完全関数型プログラミング言語
完全な関数型プログラミングをテーマとするすべての論文は、全体性を保証するために、ある種の静的型チェックを利用しています。これは、簡単にホイを検討することは、言語をチューリング完全にすることを意味します。問題は、全体の機能を保証する型付けされていない/動的に型付けされた形式はありますか? 編集する 言い換えれば、部分的な関数を構築することは不可能であり、合計関数のみを構築することを可能にする形式が存在するため、型チェッカーや終了解析のようなフィルタリングステージは必要ありません。

1
「状態」が許容されない場合、関数型言語を使用して命令型言語ですべてを実行できますか?
私はMITのコンピュータープログラムの構造と解釈(SICP)を読んでいました。私が理解したのは、純粋な関数型プログラミング言語では、ローカルな状態などは存在しないということです。SICP、pg 230は言う: 「この本の最後の2つの章で行ったように、割り当てを使用しないプログラミングは、関数型プログラミングと呼ばれています。」 私は命令型プログラミングのバックグラウンドを持っており、実際のシステム(単純な銀行やライブラリ管理ソフトウェアなど)をモデル化して、状態を意識せずにプログラムを作成する方法を理解できていないようです。 関数型プログラミングに状態の概念がない場合、どうすればよいですか?

2
Hindley-Milner型に適用されるCurry-Howard同型では、どの命題がa-> [a]に対応しますか?
(質問はHaskellに触発されているため、Haskell構文を使用しますが、SMLやElmなどの一般的なHindley-Milnerポリモーフィック型システムに適用されます)。 型シグネチャがある場合f :: a -> [a]、その型シグネチャによってエンコードされる論理命題は何ですか? 私はそのコンストラクタは好きなタイプを知って->、(,)あなたのロジックで「操作」に対応して:->「意味」シンボルに対応。→→\rightarrow 私[]も型コンストラクタであると想定しており、答えは再帰的な定義と関係があるかもしれないと感じています。これは次のように実装できることがわかっています。 data List a = Cons a (List a) | Nil しかし、これが論理の意味で何を意味するのかはわかりません。

1
IOはどのようにモナドですか?
私はHaskellプログラミング言語を学んでいます。私が読んでいるものから、入力/出力(IO)はHaskellの純粋さに対する課題を引き起こします。なぜなら、定義により、私たちは外の世界と相互作用しているからです。ウィキペディアから: Haskellなどの純粋に関数型の言語では、関数は、関数のセマンティクスの一部として、外部から見える副作用を持ちません。関数は直接的な副作用を引き起こすことはできませんが、呼び出し側が都合のよいときに適用する必要のある副作用を説明する値を作成できます。 Haskell表記では、タイプIO aの値は、実行時にタイプaの値を生成するアクションを表します。 すぐに、IOがHaskellモナドの例であることを知りました。モナドが何であるかについての多くの説明はありませんが。ファンクタ、Applicatives、そしてモナドでの写真 モナドについて学ぶ方法: コンピュータサイエンスの博士号を取得します。 このセクションでは必要ないので、捨ててください! これまでに、私はさまざまな定義を読みました。それらは、コンテキストを追加したり、特定の概念に基づいて大きな言語の中に小さなプログラミング言語を作成したりしています。それでも、どのモナドとそれらのアイデアがどのように適用されるかを理解しようとしています。 Haskellにmonadは、もう1つの型クラスがあり、基本的にそれを定義するルールは1つだけです。そしてIOその一例です。 class Monad m where (>>=) :: m a -> (a -> m b) -> m b /programming/44965/what-is-a-monad ここで代数学が起こっていますか?IOの代数とは何ですか? 言語固有であることをお詫び申し上げます。私の希望は、この議論のほとんどがすべての関数型プログラミング言語に当てはまることです。私の議論における誤りは、この領域についての私自身の限られた理解を表しています。 私がnLabで見つけたモナドの別の定義があり、それはプログラミング言語にさえ特定されていません。 別の質問で、Haskellの場合のモナドのカテゴリー理論の概念がCSの定義とどのように一致するかを理解したいと思います。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.