Existentially quantified typesは説明する:ハスケルとスカラの普遍的な定量型?
小文字タイプのいずれかの使用は、暗黙的に
forall
キーワードで始まり、その下に宣言しているようなマップには2つの型宣言は、等価です:
id :: a -> a
id :: forall a . a -> a
考えますScalaのscala.Predef#identityは、forall
に相当します。すなわち、上の2番目の関数であるHaskellのものですか?
Existentially quantified typesは説明する:ハスケルとスカラの普遍的な定量型?
小文字タイプのいずれかの使用は、暗黙的に
forall
キーワードで始まり、その下に宣言しているようなマップには2つの型宣言は、等価です:
id :: a -> a
id :: forall a . a -> a
考えますScalaのscala.Predef#identityは、forall
に相当します。すなわち、上の2番目の関数であるHaskellのものですか?
ありScalaではforall
explicitははありませんが、それは明示的なforall
sはHaskellで使用されているさまざまな方法への均等あります
ScopedTypeVariables
を有効にするには:必要のない、Scalaの型変数がスコープされているようにデフォルトでは
実在のタイプの場合:Scalaはそれらを直接サポートします。上位タイプ、関数矢印の下にネストforall
を持っているつまりもののため
:この例を考えてみます。Scalaの[A](A => A)
で
f2 :: (forall a. a->a) -> Int -> Int
f2 f x = f x
を直接使用することはできませんが、
はこれと同等ですので、実装することができますf2
:
def f2(p: Poly1, x: Int) = p(x)
私はあなたの第3の点をあまり理解していませんでした。 Haskellの例は次のとおりです。標準の 'Int => Int'よりPoly1のアプローチの利点は何ですか? – Adowrath
@Adowrathこの場合、違いはありません。代わりに、Haskellとは異なり、Scalaも 'Any => Any'を使うことができますが、' def f3(p:Poly1、x:Int、y:Bool)=(f3(x)、f3(y)より正確ではない戻り値の型を与える)。 –
興味深い。実在のタイプでもこれが可能だと思いましたが、私の理解では十分ではなかったようです。ありがとう! – Adowrath
それらが明示的にforSome
で定量化されていない限り(すなわちforall
で宣言された)私は、Scalaの専門家ではないけど、私の理解では、すべてのScalaの型パラメータが普遍的に定量化されるということです。例えば、以下を参照してください。
What is the forSome keyword in Scala for?
Haskellでは、我々は実存型を宣言するforall
キーワードを使用します。ここでQはXを含まない文です
(forSome x. P(x)) implies Q
(forall x. P(x) implies Q)
:私たちがfor some
を意味する場合forall
を使用するように直感的に見えるかもしれませんが、それは次の文の論理等価性を使用して行うことができます。
私はスケーラはあまりよく分かりませんが、引用と同じではありませんか?私は 'def identity [A](x:A):' A 'が 'forall A'でもあると仮定します。 – Carsten