タグ付けされた質問 「higher-kinded-types」

5
Scalaの上位の型とは何ですか?
あなたはウェブ上で以下を見つけることができます: より高い種類の型==型コンストラクタ? class AClass[T]{...} // For example, class List[T] 定義に準拠する型を抽象化するため、これはより高い種類の型であると言う人もいます。 上位の種類は、他の型を取り、新しい型を構築する型です これらはタイプコンストラクターとも呼ばれます。(たとえば、Scalaでのプログラミング)。 より高い種類の型==型コンストラクターを型パラメーターとして受け取る型コンストラクター? 論文Generics of a Higher Kindで、あなたは読むことができます ...タイプを抽象化するタイプを抽象化するタイプ(「より種類の高いタイプ」)... " それはそれを示唆しています class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]] より親切なタイプです。 したがって、これを念頭に置いて、型コンストラクタ、より高い種類の型、および型コンストラクタを型パラメータとして取る型コンストラクタを区別することは困難です。したがって、上記の質問です。

5
上位の型はいつ役立つのですか?
私はしばらくF#で開発を行っており、気に入っています。しかし、私がF#に存在しないことを知っている流行語の1つは、種類の高い型です。種類の多い資料を読んだことがあり、その定義を理解していると思います。それらがなぜ有用なのか、私にはわかりません。誰かが、F#での回避策を必要とする、ScalaまたはHaskellで種類の高いものが簡単にできる例をいくつか提供できますか?また、これらの例では、種類の高い型がない場合(またはF#で逆の場合)の回避策は何ですか?多分私はそれを回避するのに慣れているので、その機能がないことに気付かないでしょう。 (私は思います)私はmyList |> List.map f、myList |> Seq.map f |> Seq.toListより高い種類の型の代わりに、単純に書くmyList |> map fことができ、それがを返すと思いますList。(それが正しいと仮定して)それは素晴らしいですが、ちょっとささいなことですか?(そして、関数のオーバーロードを許可するだけでそれを行うことはできませんでしたか?)私は通常、Seqとにかく変換し、その後、必要なものに変換できます。繰り返しますが、多分私はそれを回避するのに慣れすぎています。しかし、より種類の高いタイプがキーストロークまたはタイプセーフのいずれかで本当にあなたを救う例はありますか?

2
`std :: mem :: drop`が上位のトレイト境界のクロージャ| _ |()とまったく同じではないのはなぜですか?
の実装はstd::mem::drop次のように文書化されています。 pub fn drop<T>(_x: T) { } そのため、クロージャー|_| ()(通称、トイレクロージャー)dropは、双方向での1対1の交換の可能性があると予想します。ただし、以下のコードdropは、これが関数のパラメーターにバインドされたより高いランクの特性と互換性がないことを示していますが、トイレのクロージャーは互換性があります。 fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } コンパイラのエラーメッセージ: error[E0631]: type mismatch in function arguments --> src/main.rs:10:5 | …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.