問題タブ [curry]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pattern-matching - Curry の逆コンビネータ/演算子のコンパクト対フル/冗長定義
かなり魅力的な 2013 年のWolfgang Jeltsch によるHaskell ベースのCurryのKiCS2実装への紹介記事、 A Taste of Curryは、コンビネータについて次の定義を提供します。inverse
(注:inverse (+1) 3 == 2
これはやinverse (*3) 12 == 4
やのようなことを行いinverse htmlHodeToStr == parseHtmlNode
、カレーに慣れていない通行人のために、他の信じられないほど素晴らしいことを無数に行います)
さらに、(非決定論的)split :: [a] -> ([a], [a])
関数の 2 つの代替ではあるが同等の定義も提供します。
と
他のかなり啓発的な定義と同様に、この投稿の範囲を超えています。
しかし、私の考えでは、とinverse
の精神に基づいて、の別のコンパクトな定義を試みました。split
split'
一方、これは次のエラーにつながります。
私の質問: なぜカリーはf
関数型パターン(f x)
の をデータ コンストラクターとして解釈するのに++
、(関数型の) パターン(xs ++ ys)
の を関数名として解釈するのですか?
言い換えれば、xs
and ys
inはinsplit' (xs ++ ys) = (xs,ys)
とまったく同じように見えます。x
inverse' f (f x) = x
または、 との類推split'
がすぐには明らかでない場合は、prefix (xs ++ _) = xs
またはorig (1 + x) = x
などを検討してください。どちらもコンパイルして正常に実行されます。
PSこの質問を理解しやすくするために、名前と型のシグネチャを元の投稿と比較して少しだけ調整しました。
parsing - 文法に制約のある「逆」でパーサーを生成する
私は最近、A Taste of Curryをたどり、その後、もう少し実質的なパーサーを作成することによって、簡単な算術パーサーの例をテストすることにしました。
記事で例示されているように、(属性と子を使用して)node2string
動作する関数を作成し、それから関数を取得しました。Node
inverse
parse
<input/>
最初のナイーブな実装には、単純なHTML スニペットなどを正確に 1 つのNode
表現に解析するという誤りがありました。他のすべては、非決定論的に次のような無効なものを生成しました
等々。
内部からそれを修正するためのいくつかの最初の素朴な試みの後node2string
、私はポイントに気付きましparse = inverse node2string
た<input type="submit"/>
.その2 つの有効で構築可能な値はNode
、HTML 表現につながります。
Node
私は、アルファベットのみを渡すことを許可するように制限する必要があることに気付きましたAttr
. 論理プログラムよりも基本的ではない設定 (純粋な宣言型プログラミングとは対照的に、はるかに手書きで「指示的」な通常の Haskell など) では、Node
コンストラクターをmkNode
センチネル関数などの背後に単に隠していたでしょうが、私はこれを感じています。推論エンジンまたは制約ソルバーがどのように機能するかにより、Curry ではうまく機能しません (これについては私が間違っている可能性があります。実際、そうであることを願っています)。
そのため、代わりに次のようになりました。Curry のメタプログラミング (または、Curry がサポートしていれば Template Haskell) を使用して手動のボイラープレートをクリーンアップできると思いますが、表面的な処理は状況から抜け出す方法の 1 つにすぎません。
実際、これは完全に機能します(私の判断では):
(Curry には型クラスがないため、[NameChar]
print をより適切に作成する方法はまだわかりません)
ただし、私の質問は次のとおりです。
のようなものisAlpha
(または実際の HTML 仕様により忠実な関数) を使用して、これと同等の結果を達成する方法NameChar
はありますか? ADT 内のどこかに「機能制限」を配置することすらできないようです。
依存型付き関数型論理プログラミング言語では、制約を型レベルで表現し、推論エンジンまたは制約ソルバーに処理させるだけですが、ここでは途方に暮れているようです。