問題タブ [kics2]
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この質問を理解しやすくするために、名前と型のシグネチャを元の投稿と比較して少しだけ調整しました。