問題タブ [polyvariadic]
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.
haskell - Haskellでは、m-ary述語とn-ary述語を取得して、(m + n)-ary述語を作成するにはどうすればよいですか?
今日、私は型クラスを使用して、任意の型の任意の組み合わせを入力として受け取り、同じ型の他の述語を返すが、いくつかの基本的な操作を適用した、任意のアリティの述語の関数を帰納的に構築することで遊んだ。例えば
2より大きい偶数に対してtrueと評価される述語を返します。
=を返します
すべてうまくいきましたが、その部分は機能しましたが、2つの述語の接続詞を、結合された各述語の入力ごとに1つの入力を受け取る述語として定義したい場合はどうでしょうか。例えば:
Ord a => a-> a->Bool->Boolを返します。これはできますか?もしそうなら、どのように?
go - Goの可変個引数の一般的な引数
スライス用に、GoのJavaScriptArray.splice
関数と同等のものを作成したいとします。私は次のコードを持っています:
この例は機能しますが、タイプがの引数に対してのみ機能しますint
。汎用にしたいので、可変個引数の引数elements
に型interface{}
を指定する必要があることはわかっていますが、関数内からそのインターフェイスの型を使用して新しいスライスを作成するにはどうすればよいですか?
言い換えると、関数の最初の行の引数のタイプに応じて、スライスのタイプを動的に指定するにはどうすればよいですか?どこnewslice
で作成されますか?
c++ - 可変引数関数パラメーターを使用した C++ ポリモーフィズム
可変引数関数パラメーターを使用するクラスで発生した問題を共有しています。次のコードに示すクラス Thread です。関数パターンを使用するための std::thread のラッパーです。
クラス Thread を新しいクラス Functor に継承する際に、この関数でポリモーフィズムを使用したかったのですが、gcc は以下のエラーを返します。
純粋仮想関数は派生クラスで適切に定義されているため、エラーを本当に理解していません。ただし、関数 run() を派生クラス (Functor) に移動すると機能します。
前もってありがとう、カナー
haskell - 多変量一般化和
この回答は、引数を合計する多変量関数を示しています。
のすべてのメンバーに対して、この関数の一般化されたバージョンを作成しましたNum
。
ただし、これは のような呼び出しでのみ機能しますmySum (1::Int) (3::Int) (2::Int) :: Int
。引数に型指定子がないと、次のエラーが発生します。
「mySum」の使用に起因する (MySumType n0 Float) のインスタンスはありません
可能な修正: (MySumType n0 Float) のインスタンス宣言を追加します。
式: mySum 1.0 :: Float
「it」の式: it = mySum 1.0 :: Float
この問題の原因は何ですか?どうすれば修正できますか? 整数リテラルの型が であることに関係しているのではないかと思いますNum a => a
。また、拡張機能に依存しない上記の機能と同等の機能はありますか? 上記で使用されているのは、複数のパラメーター型クラスと柔軟なインスタンスです。
function - 多変量カレー定義のあいまいな型変数
だから、ここで説明されているように、多変量の ZipWithN を実装しようとしています。残念ながら、Paczesiowa のコードは ghc と HList の両方の古いバージョンでコンパイルされているようです。そのため、それがどのように機能するかを理解しようとする過程で、両方の最新バージョン (ghc-現時点では 7.8.3 および HList-0.3.4.1)。楽しかったです。
とにかく、中間関数の定義で、Googleが一度も修正するのを手伝ってくれないというバグに遭遇しましたcurryN'
。概念curryN'
は単純です: 型レベルの自然数N
(厳密に言えば、その型の値) と、f
最初の引数が length の HList である関数を取り、make HList を取る -ary 関数をN
返します。N
最初のN
引数のうち、そのf
HList に適用されたものを返します。ですcurry
が、多変量です。
3 つのヘルパー関数/クラスを使用します。
ここで定義したように、最初はResultType
/です。 単一の関数を引数として取り、その関数を必要な数の引数に適用した後、その関数の型を返します。(厳密に言えば、その型の未定義の値を返します)。resultType
resultType
例えば:
(後者のケースは、a
たまたま type の関数だった場合x -> y
、 resultType は を返さなければならないためですy
。したがって、多相関数に完全に適用されるわけではありません。)
2 番目の 2 つはEat
/eat
とMComp
/で、こののように (壊れた とともに) 1 つのファイルでmcomp
一緒に (とともに) 定義されます。curryN'
curryN'
eat
の最初の引数は、型が自然数の値であり、引数を受け取り、それらを組み合わせて HList に返すN
関数を返します。N
私が知る限り、それは完全に機能します。 mcomp
多変量構成関数です。これは と の 2 つの関数をf
取りg
、f
いくつかの引数を取りますN
。N
引数を取りf
、それらすべてに適用してからに適用g
する関数を返しますf
。(関数の順序(>>>)
は よりも並列(.)
)
のようresultType
に、戻り値の型が型変数である関数では「中断」しますが、eat
(最終的な戻り値の型が単なるHList
) でのみ使用する予定なので、動作するはずです (Paczesiowa は少なくともそう考えているようです)。eat
の最初の引数が固定されている場合は、次のようになります。
正常に動作します。
curryN'
ただし、次のように定義されます。
ただし、これを ghci にロードしようとすると、次のエラーが発生します。
明らかにeat
、mcomp
私が望んでいるほどうまく一緒にプレイしないでください。mcomp (+) (+1)
ちなみに、これは、 のインスタンスの重複について不平を言うエラーの種類とは大きく異なりますMComp
。
とにかく、このエラーに関する情報を見つけようとしても、何の役にも立たなかった - 私自身のデバッグの最大の障害は、どの型f0
にも現れないので、型変数が何であるかさえわからないことである.署名またはコンテキスト ghci が推測します。
私の最善の推測は、の多相的な戻り値の型を再帰するのmcomp
に問題があるということeat
です (それが型レベルの自然数によって修正されているにもかかわらず)。しかし、もしそうなら、私はそれを修正する方法がわかりません。
さらに(そして私には奇妙に)、 と をPart1.hs
単一Part2.hs
のファイルに結合しようとすると、まだエラーが発生します...しかし、別のファイルです
再び謎のf0
型変数で。私はこのタイプハッカーのすべてについてここで少し頭を悩ませていることを認めます.うまくいけば、可能です)、私は信じられないほど感謝しています.
最後の注意: ここで 2 つのファイルが Part1 と Part3 と呼ばれる理由は、Part2 には で使用されるいくつかの補助関数が含まれていますが、 では使用されてzipWithN
いないためcurryN'
です。ほとんどの場合、それらは正常に機能しますが、後で尋ねるかもしれない奇妙な点がいくつかあります。
haskell - このパーサーを適用可能な多変量パーサーにするにはどうすればよいですか?
次のような日付を解析しようとしています09/10/2015 17:20:52
:
私はある種のzipWithN
一般化の予感を持っていlistUncurry
ます。多分ある種のfoldl ($)
?
副次的な質問として (好奇心から)、parsec
パーサーは生成的に使用できますか?
haskell - Haskell、多変量関数と型推論
多変量関数の例を探しているときに、次のリソースを見つけました: StackOverflow: How to create a polyvariadic haskell function? 、そして次のような回答スニペットがありました:
次に、次を使用できます。
一見したところかなりトリッキーだとわかったので、好奇心のために少し変更してみましたが、次のようになりました。
に変更Integer
しInt
、instance (Integral a, SumRes r) => SumRes (a -> r) where
多態性を減らしましたinstance (SumRes r) => SumRes (Int -> r) where
それをコンパイルするには、XFlexibleInstances
フラグを設定する必要がありました。関数をテストしようとするsumOf
と、問題が発生しました。
それから私は試しました:
型クラス内でInt
を使用しているのに、なぜ Haskell はこの状況で が必要であると推測できないのでしょうか?Int
SumRes
haskell - 競合が発生するのはなぜですか?
だから私はこれを入力しました
そして私は得る
しかし、それは同じではm
ありm->a
ません。なぜそれは私に対立を与えているのですか? (また、(ライブラリのスタイルで)多変量の mconcat を作成する方法に関するヒントはありprintf
ますか?