問題タブ [constraint-kinds]
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 - GHC 7.4.1の制約の種類の構文は何ですか?
Constraint
簡単な例を書こうとすると、範囲外のエラーが発生します。
エラーは、
制約の同義語は期待どおりに機能しているようですが、
前もって感謝します。
haskell - Numeric.AD 関数で許容される型
ad
パッケージに含まれる型の基本的な配管に頭を悩ませることにほとんど成功していません。たとえば、次のコードは完全に機能します。
grad
タイプは次のとおりです。
ex
toの型シグネチャを変更し[Double] -> Double
て同じことを試すと、
をインスタンス化Double
する種類の一見任意の型コンストラクターに置き換えると、同じ動作が発生します。 *
Num
がリストの場合Traversable f
、 の最初の引数は、許容されるgrad
型(たとえば. しかし明らかに、 のユーザーは、コンストラクターや を直接処理する必要はありません。これらの内部を覗いてみると、私は少し混乱しました。具体的には、との使用の違いについて、種類/型の軌跡をたどることができません。 [AD s a] -> AD s a
Mode
Reverse
grad
AD
Mode
Num a => [a] -> a
[Double] -> Double
[Double] -> Double
型シグネチャが で問題を引き起こすのはなぜgrad
ですか? そして、単純な古いライブラリの使用に関して: の[Double] -> Double
バージョンを使用する方法はありますかex
、それともポリモーフィック バージョンが必要ですか?
(この同様の質問に触発されたタイトル)
haskell - ConstraintKindsを使用してすべての基本型クラスを一般化して制約を許可するライブラリはありますか?
拡張ConstraintKindsを使用して、基本型クラスの機能を拡張し、制約を許可できます。たとえば、ボックス化されていないベクトルをファンクターにすることができます。
(詳細については、これらのブログ 投稿を参照してください)。
この新しいスタイルで基本ライブラリ型クラスのかなりの部分を実装していることに気づきました(基本的に、ボックス化されていないベクトルとリストの間で交換可能に作業できるようにしたい)、このためのライブラリがすでに存在するかどうか疑問に思っています。 、または私が肉付けしてハッキングに追加する必要がある場合。
編集:また、これをベースに直接追加する計画はありますか?クラス定義を直接更新するだけでは、他に何も壊してはならないようです。
haskell - 「制限された」制約で制約の種類と型ファミリを使用する
実行を「表示」するためのモノイドを含むアプリケーションファンクターに取り組んでいます。ただし、この部分がまったく気にならない場合もあるため、モノイドの選択は、決して消費されないため意味がありません。私が持っているものを単純化しました:
Render
a
さまざまなを単一のに変換するために使用されb
ます。Merge
私の実際のファンクターを大幅に単純化したものですが、要点は、型ファミリー/制約が含まれていることであり、その意図はRender
、Merge
必要なものを正確に指定することです。
ここで、 を「実行」したいかもしれませんが、Merge
次のようなビューを破棄します。
しかし、これは次の理由で失敗します。
(Renderer a ())
の使用から生じると推測できませんでしたmerge
()
foralla
のインスタンスがあるため、モノイドとして選択しましたRender a ()
。したがって、それがMerge a
単にコレクションのRender
制約を意味すると言う方法があれば、これはうまく機能します。もちろん、Merge a
それよりも一般的です-コンパイルエラーを説明する任意の制約を追加できます。
の署名を変更せずに、私が望むものを達成する方法はありrunFoo
ますか?
haskell - 制約付きのタイプリスト
タイプレベルでリストを作成しようとしていますが、制約を適用する方法を理解するのに問題があります。
私のベースコードは次のとおりです。
q
上記のsは素数冪を表すと考えることができます。また、sの型リストを使用して合成数を表現したいと思いqi
ます。私は次のようなものを想像しています:
データで
に(Head q)
対応する必要があり、に対応する必要がqi
あります。のパラメータは(必然的に)aではなく、のリストであることに注意してください。(これは私が提起している設計上の問題の1つであるため、このリストについてこれ以上具体化したくありません)。私は「モジュラスワイズ」で作業したいと思います:(Tail q)
qs
q
FList
(Qux q)
(Qux qi)
FList
これらのコードスニペットをGHCで一緒にコンパイルすると、(モジュロ転写、抽象化、および入力エラー)が発生します。
その後
等
このエラーが発生する理由はわかりますが、修正方法はわかりません。
具体的には、とのタイプを期待していますFList c q
。もちろん、私のリストは、すべてのレベルですべてのBCtx制約を満たします。c~Foo z
q~QCons q1 (QCons q2 QNil)
これらの特定のエラーを修正するとコードがコンパイルされるかどうかはわかりませんが、それは始まりです。Barクラス全体は基本的に固定されています(Constraintの種類が必要であり、Barのインスタンスの種類は*-> *である必要があります)。qi
パラメータにアクセスする必要があるため、実存型を使用してジェネリックオブジェクトのリストを作成できるとは思いません。種類を変更してFList
、バーのコレクションでモジュラス単位で作業QList
できるようにします。
御時間ありがとうございます!
haskell - 制約の種類を持つポリモーフィック STUArray の再検討
スコア型に動的プログラミング アルゴリズム ポリモーフィックを実装したいと考えています。これは、境界条件のない単純化された 1D バージョンです。
制約は機能しません。
要約すると、Could not deduce (MArray (STUArray s) e (ST s)) from the context forall s. MArray (STUArray s) e (ST s i)
. に制約を追加するとresultArrayST
、問題が にプッシュされるだけであることに注意してくださいrunSTUArray
。
私は現在、4 つの欠陥のあるソリューションを知っています。
STArray
ボックス化されたs または単に非モナドs の問題を回避しArray
、おそらくseq
and bang パターンを使用して、結果として生じるメモリの問題を緩和します。unsafeFreeze
とを使用して型システムを壊します。unsafePerformIO
これには、ひどい制約が正常にMArray IOUArray e IO
機能します。- タイプクラスを使用し、すべての「ボックス化できない」タイプのインスタンスを作成する同様の問題に対するこのソリューション。
- これは GHC 書き換えルールを使用して、各タイプ (および汎用
STArray
バージョン) ごとに異なる関数を選択します。
ConstraintKinds
ただし、最新の言語拡張により、元のコードの意図を表現できるようになることを期待して、この質問をしていforall s. MArray (STUArray s) e (ST s)
ます。
haskell - 制約の種類: 複数の制約を渡す
Haskell で次のようなデータ型がある場合:
次に、特定のクラスの型の値に作用する関数をこのデータ型に入れることができます。
しかし、複数の制約を持つ関数をこのデータ型に入れることは可能ですか? 私はこれを試しました:
したがって、これは機能しません。どうすればやりたいことができるのか、それとも不可能なのか? 「ダミー」データ型と型ファミリを使用することが 1 つの解決策であることはわかっていますが、複雑なため別の方法がある場合はそうしたくありません。また、この例では succ の代わりに (+1) を使用することもできましたが、1 つのクラスだけに変換できない複雑なケースもあります。
haskell - ConstraintKind の矛盾?
カスタム制約を使用して、組み合わせの爆発を抑制したいと考えています。
カスタム制約を使用すると、このコードはコンパイルに失敗します:
しかし、代わりに制約を手動で書き出すと、次のようにコンパイルされます。
これはバグですか、それとも何か不足していますか?
haskell - 「自明な制約」または「オブジェクトクラス」の標準実装はありますか?
私はただ欲しい
Haskell 98 では制約を省略できるので、これはもちろん役に立ちません。しかし、ConstraintKinds
明示的に必要な種類の引数を持つことができます* -> Constraint
。理想的には、これを「匿名型レベル関数」として定義したいのです\type a -> ()
が、それは明らかに不可能です。
どうすればいいですか、定義済みのものを使用するか、必要な場所でそのクラスをローカルに定義するだけです(インスタンスはユニバーサルであるため、誰もアクセスする必要がないため、それもまったく問題ないようです)?