問題タブ [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.

0 投票する
3 に答える
1757 参照

haskell - Haskellの多変量関数

Haskellで多変量関数を書くことについてのこの記事を読んだ後、私は自分自身のいくつかを書こうとしました。

最初はそれを一般化しようと思ったので、与えられた引数を折りたたむことで可変個引数関数を返す関数を作成できました。

しかし、コンパイラはそれを気に入らなかった:

ただし、戻って最終結果のラッパータイプを追加すると、次のように機能しました。

この変更を行うと、正常にコンパイルされ、でcollapse関数を使用できるようになりましたghci

最終結果にラッパータイプが必要な理由がわかりません。誰かがそれを説明できれば、私はそれを高く評価します。コンパイラーが機能依存性に問題があると言っているのはわかりますが、fundepsの適切な使用法についてはまだ理解していません。

後で、私は別の方法を取り、リストを取得して値を返す関数の可変個引数関数発生器を定義しようとしました。私は同じコンテナトリックをしなければならず、また許可しなければなりませんでしたUndecidableInstances

UndecidableInstancesコンパイラが私のインスタンス宣言が違法であると文句を言うことを許可せずに:

ただし、コンパイルすると、ghciで正常に使用できます。

が探しているのは、最終値のコンテナータイプが必要な理由と、さまざまな機能依存性がすべて必要な理由の説明だと思います。

また、これは奇妙に思えました:

それは許可の結果UndecidableInstancesだと思いますが、わかりません。何が起こっているのかをもっとよく理解したいと思います。

0 投票する
5 に答える
12708 参照

haskell - 多変量haskell関数を作成する方法は?

任意の数の引数(すべて同じタイプ)を取り、それらを使用して何かを実行し、その後結果を返す関数が必要です。私の特定のケースでは、引数のリストは実用的ではありません。

haskell libsを調べてみると、printf(モジュールからのText.Printf)関数が同様のトリックを使用していることがわかりました。残念ながら、ソースを見てもその魔法は理解できませんでした。

誰かがこれを達成する方法、または少なくともいくつかのウェブページ/紙/私がこれについての良い説明を見つけることができるところなら何でも説明できますか?

動機:

私がこれを必要とする理由は本当に非常に単純です。学校(コンピュータサイエンスの授業)では、数式を「記録」して文字列として表現し(独自のデータ型のNum / Realなどのインスタンスを書き込むことにより)、実行できるモジュールを作成する必要があります。その上でさまざまな操作。

このデータ型には、変数の特別なコンストラクターが含まれています。このコンストラクターは、値など、指定された関数で置き換えることができます。目標の1つは、いくつかの変数(型のペア(Char,Rational))を持つそのような式を取り、式の結果を計算する関数を作成することです。関数の目的を最もよく表現する方法を検討する必要があります。(私の考え:関数は、関数で定義されている変数とまったく同じ数の引数を取る別の関数を返します-不可能のようです)。

0 投票する
1 に答える
1323 参照

haskell - 可変数の引数を宣言するのに役立ちます

ハイガイズ、

複数のノードを持つことができるツリーのポリモーフィック データ型を定義する必要があります。各ノードは、任意の数の子と値を持つことができます。このタイプには、常に少なくとも 1 つのノードがあります。私はHaskellが初めてなので、ノードが可変数の引数を持つように宣言する方法を尋ねています。

これは私が今持っているものです。これは、Node または値 (a) を持つノードと 2 つのツリーの子を持つことができるツリーです。2 つのツリーの子の代わりに、任意の数のツリーの子にしたいと考えています。(Java 可変数の引数 "arg..." と同様)

ご協力いただきありがとうございます

編集

ちょっとした質問::: 関数パラメーター (ヘッダー/署名) で可変引数を使用してこのノードを宣言するにはどうすればよいですか。
ノードに特定の要素が含まれているかどうかを確認する「contains」 という関数を実装する必要があります。

2行目は正しいですか?

0 投票する
1 に答える
647 参照

haskell - アリティ0を含むHaskellで任意のアリティ関数を定義するにはどうすればよいですか?

任意のアリティの関数を定義するための現在のアプローチは次のとおりです。Aはアキュムレータ、Eは入力引数タイプ、Rは結果タイプです。

ただし、fooの最小アリティは1です。fooの最小値はA-> E-> Rであり、doFooはE->Rです。doFoo::Rも必要です。どうすればよいですか。

0 投票する
4 に答える
756 参照

haskell - IO を使用した Haskell 多変量関数

外部関数の引数の一部が CString である外部関数呼び出しを受け取り、代わりに String を受け入れる関数を返す関数を持つことは可能ですか?

これが私が探しているものの例です:

C数値型でこれを行う方法を見つけました。ただし、文字列変換を可能にする方法がわかりません。

newCString や withCString などの CString に変換されるものはすべて IO であるため、この問題は IO 関数に当てはまるようです。

double の変換のみを処理するコードは次のようになります。

0 投票する
1 に答える
226 参照

haskell - Haskell の可変長バインド

次のコードは、次のように動作する可変引数関数を記述しようとする試みです。

  • bind_variadic mx f = mx >>= f
  • bind_variadic mx my f = do { x <- mx; y <- my; f x y }

「バインディングの残り」を変数として表現すればk記​​述できますが、型クラスを記述するには、一方の関数をもう一方の関数で記述する必要があります。正確には 、 、などで表現l1したい。l0l2l1

おそらく、解決策には別の継続が含まれますか?

編集

これは、追加の結合が必要なアイデアです...

0 投票する
1 に答える
15460 参照

haskell - Haskell printf はどのように機能しますか?

Haskell の型安全性は、型依存型言語に勝るものはありません。しかし、 Text.Printfには、かなりタイプがおかしいように見える深い魔法があります。

この背後にある深い魔法は何ですか? 関数はどのText.Printf.printfようにしてこのような可変引数を取ることができますか?

Haskellで可変引数を許可するために使用される一般的な手法は何ですか?それはどのように機能しますか?

(補足: この手法を使用すると、型の安全性が明らかに失われます。)

0 投票する
4 に答える
980 参照

c# - 「特定の 1 つのサブクラス」ではなく、C# 型制約で「任意のサブクラス」を指定する

TDerived がクラス "Base" の任意のサブクラスである "TDerived" の可変数を取るメソッドを書きたい場合、これを行う方法はありますか?

次のコードは、1 つの特定の指定されたサブクラスでのみ機能します。

つまり、私が持っている場合

それなら私にはできない

「最適なオーバーロードされた一致...いくつかの無効な引数があります」と表示されるためです。

コンパイラが型制約と可変個引数関数をどのように処理するかに関係なく、これは (私が知る限り) 完全に型安全であるように見えます。キャストできることはわかっていますが、これがタイプセーフである場合、許可しないのはなぜですか?

編集:

おそらくより説得力のある例:

0 投票する
3 に答える
10742 参照

haskell - Haskell「適用」?

重複の可能性:
なぜそのような関数定義が haskell で許可されないのですか?

私は Haskell の世界の初心者であり、Lisp から移行しています。私は、Haskell の根本的に異なる世界観に適応しようとしています。私が新しくてエキサイティングだと思う多くのことの 1 つは、型システムです。私は Lisp として、Lisp の世界で非常に重要な関数を Haskell で実装しようと考えましたapply。知らない人のために説明すると、 apply は関数と引数のリストを取り、それらの引数で関数を呼び出します。Scheme では、(apply + '(1 2 3))を呼び出すのと同じで、(+ 1 2 3)6 を返します。

私の Haskell コードは次のようになります。

しかし、Haskell は次のように不満を述べています。

そして、私はその理由を理解していると思います。Apply の型は、与えられたリストの長さに応じて異なる必要があります。たとえば、3 つのアイテムのリストが与えられた場合、apply のタイプは:(a -> a -> a -> b) -> [a] -> bである必要がありますが、6 つのアイテムのリストが与えられた場合、apply のタイプは: である必要があります(a -> a -> a -> a -> a -> a -> b) -> [a] -> b

私はこの恐ろしい回避策を試しました:

これは機能しますが、関数としてはほとんどカウントされません。通常の関数applyを渡すことができないためapply、(厄介な) FnOrDat 抽象化を使用するために特別に作成された関数を使用する必要があります。4 つの数値を加算する関数を書きたい場合は、次のように書く必要があります。

ええ。

applyそれで、私は何かが欠けていますか、それとも基本的に任意の長さのタプルを操作できる関数を求めるような汎用を求めていますか? applyHaskell の静的に型付けされた世界観でも意味があるのでしょうか?

0 投票する
1 に答える
320 参照

haskell - Text.Printf.printf を使用した関数合成

次のようなロガー関数を定義したいと思います

これは問題ありません。printf今、私は提供された文字列を次のようにフォーマットしたいと思います

すごい!printf私はこのパターンを非常に頻繁に持っているので、ロガー関数を考慮したいと思います:

残念ながら、これは失敗します

GHC は を推論myPrintf :: String -> IO ()するので、明らかに何か問題があります。Polyvariadic compositionについて何かを見つけましたが、これを私の問題に適用することはできません。それが私の問題を解決するかどうかさえわかりません。

コードはgistからも入手できます。