5

Haskell のように関数を適用するのではなく、関数名の連結は関数の合成と同じであるというのが本来の考え方である連結言語の基礎を学んでいます。

Joy、Forth、または Factor は後置、つまりスタック ベースを意味しますが、Om などの前置連結言語もいくつかあります。

Haskell バリアントは、合成の優先順位 (現在は 9) を関数適用の優先順位 (現在は 10) と交換する (または等しくする) だけで、理論的には連結言語になるのではないかと思います。

Haskell の値が引数のない関数にすぎない場合、関数の適用が関数の合成と異なるのはなぜですか?, 関数の適用は、引数のない関数で合成することと同じではありませんか?.

新しい合成演算子と適用演算子を異なる優先順位で定義し、括弧のない単純な連結が合成であると仮定することにより、連結構文を Haskell 構文に変換するインタープリターまたはプリコンパイラーを簡単な方法で作成することは可能でしょうか? これは単なる構文の問題だと思いますが、私は間違っていますか? Haskell で括弧や $ 演算子を使用しなければならない多くのケースを避けることができます。それとも、構文や優先順位だけでなく、もっと根本的な問題なのでしょうか?

ヒント: Haskell のすべての関数と演算子が接頭辞であると仮定すると、この演習では、中置記法とあらゆる種類の「構文糖衣」について忘れることができます。

4

2 に答える 2

5

Haskell の値が単なる定数関数である場合、関数の適用が関数合成と異なるのはなぜですか?関数の適用は、定数関数で合成することと同じではありませんか?.

Haskell の値は「定数関数」ではありません。また、それらは「nullary 関数」でもありません。関数である Haskell の唯一のものは、型が function-arrow constructor を含むものです->

定数関数とは、任意の入力に対して同じ出力を返す関数です。

alwaysOne x = 1

map alwaysOne [1..5] == [1, 1, 1, 1, 1]

このような関数の導関数は 0 です。このconst関数は、2 番目の引数を無視し、常に最初の引数を返すことによって、このような関数を便利に構築します。

map (const 1) [1..5] == [1, 1, 1, 1, 1]

「nullary 関数」の概念は、関数が複数の引数を取る言語でのみ意味を持ちます。Haskell では、複数の引数を持つ関数の定義は、カリー化として知られるプロセスで、1 つの引数を持つ連鎖関数の定義の構文糖衣です。これらの定義はすべて同等です。

foo x y = x + y

foo x = \y -> x + y

foo = \x -> \y -> x + y

(実際には、効率上の理由から、GHC のランタイムは複数引数の関数を扱い、部分的に適用された関数のクロージャ オブジェクトのみを構築します。)

それは単なる構文の問題だと思いますが、間違っていますか?

連結言語の基本的な考え方は、プログラムは関数を表し、2 つのプログラムを連結すると、それらの関数の構成を表すプログラムが得られるというものです。したがって、fが関数であり、gが関数である場合、f gは Haskell で次のように記述するプログラムを示しg . fます。抽象代数の用語では、構文モノイドから意味モノイドへの準同型があります。それが構文の問題です。

ただし、セマンティクスの問題もあります。これらの関数は、それらの間で暗黙的に渡されるプログラムの状態を操作する必要があり、実際のプログラムの状態は複雑です。したがって、実際には、連結言語は値のスタックを表すタプルを使用する傾向があります。これは、実際に実装するのが簡単で効率的だからです。ハードウェア。理論的には、プログラムの状態は、マップやセットなど、何でもかまいません。

Haskell のセマンティクスがここでの真の障害だと思います。連結 DSL を Haskell に埋め込むことはできますが、これを日常のプログラミングで使用できるようにするには、連結言語が必要です。

于 2014-12-31T05:57:59.090 に答える
1

私の質問に対する最良の答えは、@Daniel Wagner が 2 番目のコメントで参照した記事「Concatenative, Row-polymorphic Programming in Haskell」です。これは、@Jon Purdy による別の優れた記事「なぜ連結プログラミングの問題」 .

それは「Haskell 内で連結 DSL を実装する 1 つの方法」を示しています。

于 2015-11-05T18:43:40.117 に答える