問題タブ [data-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 - Haskell での配列サブスクリプションの EDSL 関連の実装に関する問題
環境
IBM の OLP (線形プログラミングのモデリング言語) に大まかに似た EDSL を実装しようとしています。
コード
Haskell EDSL コード
EDSL と OPL の比較
oplコードに対応
関連セクション
としても
問題の説明
OPL は配列サブスクリプションにブラケットを使用します。次の表記法を使用して、サブスクリプションを EDSL にマップしようとしました
これは、次の意味で OPL に対応します。
前者では、 (Id "p" :+ Id "f" :+ Nil) は、ベクトルの長さに関する型レベル情報を含む Vector 型の値を構築します。コンストラクタ :? の定義によると、 Iterate (n) [] Double は [[Double]] に展開されることがわかります。これは期待どおりにうまく機能します。ただし、生成された構文ツリーを使用するには、実際の値に対してパターン マッチを行う必要があります。
問題: 上記の行は機能しますが、実際のデータの使用方法がわかりません。パターンマッチのやり方は?とにかくデータを使用することさえ可能ですか?明らかな dbl の置換
動作しません。また、データ ファミリを構築しようとしましたが、任意にネストされた Double のすべてのリストのファミリを再帰的に作成する方法がわかりませんでした。
haskell - Servant ライブラリでの DataKind 型昇格の解読
タイプレベルの Web DSL であるサーバントライブラリのチュートリアルを読み進めようとしています。ライブラリは、言語拡張機能を広範囲に使用します。DataKind
そのチュートリアルの早い段階で、Web サービスのエンドポイントを定義する次の行を見つけました。
型シグネチャに文字列と配列があることの意味がわかりません。また、 の前の目盛り ( '
) が何を意味するのかわかりません'[JSON]
。
私の質問は、文字列と配列の型/種類は何か、そしてこれが後でWAI エンドポイントになったときにどのように解釈されるのでしょうか?
補足として、説明するときにNat
and を一貫して使用すると、このことを理解しようとするときに、イライラするほど限られた例を見ることができます。その例をさまざまな場所で少なくとも十数回読んだと思いますが、何が起こっているのかまだ理解できていません。Vect
DataKinds
haskell - ブール値と STLC のチャーチ エンコーディング
とよく言われます
「これらの用語を使用して、ブール値の真偽をテストする操作を実行できる」という意味で True と False を表します。
しかし、それは型指定されていないラムダ計算でのみ真であるように見えるという点で、重要な警告を隠しています。これらの値を haskell に差し込むだけで、関数を記述できます。
型レベルで tru と fls を区別します。次のように言うのはどれほど間違っている/本当でしょうか:
- STLCでは
tru
、タイプとfls
'Boolean
'True
'False
- STLC では、(強制された) 型付きの値
(tru :: ∀ t . t → t → t)
であり、(fls :: ∀ t . t → t → t)
True と False を表します (そして型なしでは、よくあることです)
編集:@Daniel Wagnerの回答のおかげで、質問でSTLCではなく2次ラムダ計算を考えていたことに気づきました。
haskell - 代数データ型における Haskell の型/種類の混乱 (たぶん)
私はHaskellで独自の外交シミュレーターを構築して、足を濡らしてきました。
注文とは何かについて、適切な定義を思いついたと思います。
ゲームに慣れていない人のために、命令は「Hold Fleet London」、「Move Fleet London English Channel」、「Support Fleet English Channel Fleet North Atlantic Ocean Mid Atlantic Ocean」、または「Convoy Fleet English Channel Army」の形式で書かれています。ロンドン・ブレスト」など
さて、 Unit を として定義すると、 Order の定義に関してdata Unit = Fleet | Army (deriving Eq, Show)
エラーが発生します。Not in scope: type constructor or class 'Fleet'
どうしてこれなの?
Convoy の最初の引数が Fleet で、3 番目の引数が Army であることを要求できるようにするには、Units または Orders の定義をどのように記述すればよいでしょうか (または別のことを行う必要がありますか)。
この問題に対する私のアプローチは「間違っていない」だけですか?
検証関数でこれにアプローチする必要があります (私の知る限り、Haskell を介して有効な注文のみを指定する方法がないためです。それは表現力豊かですが、それほど表現力豊かではありません)。
私はすでに「DataKinds」を使用してみましたが、それはまったく役に立ちませんでした (エラー ポストスクリプトがそうすることを示唆しているにもかかわらず、Haskell エラー ポストスクリプトは多くのことを示唆しているため、あまり注意を払う必要があるとは思えません)それ)。
haskell - Haskell データ型内で整数リテラルと演算を使用する方法
私は最近DataKinds
、演算用のコンパイル時の科学単位を使用するためにいじり始めました。私は多かれ少なかれ自分がやりたいことをする方法を見つけましたが、それはもっときれいになるかもしれないと感じています.
負になる可能性がある整数 (m^-1) が必要だったので、自然数ではなく整数を使用することにしました。しかし、あなたが:k 5
それを行うとGHC.Types.Nat
、私のニーズに合わないことがわかります。代わりに、独自のカスタム代数整数型を作成することになりました。それと一緒に使用する加算および減算タイプのファミリを定義するだけでなく。
しかし、これはすべて非常に間接的であるように思われます。型ファミリ内でコンパイル時にデータを操作するために既存のすべての関数を直接使用できない理由はないようです。
基本的に、次のものが本質的に自動的に生成されるようにします。
それは可能ですか?
また、型からランタイム値を取得する簡単な方法はありますか? 具体的には、Show
これらすべての型のインスタンスを作成するときは、基本的に、ユニットの組み合わせを表すファントム型を取得して、それを文字列に変換したいだけです。私が今それを行うと考えることができるすべての方法は、本当に冗長に思えます。
haskell - forall量指定子を「uncurry」することは可能ですか?
DataKinds によってプロモートされたペアによって、2 つの型を取る型コンストラクタ f があるとします。
次に、数量詞のforward
ような関数を実装できます。curry
forall
ただし、逆関数には問題があります。
GHC 8.0.1 では次のエラー メッセージが表示されます。
概念的には、有効なプログラムのようです。この機能を実装する別の方法はありますか? それとも、これはGHCの既知の制限ですか?