2016-05-31 6 views
3

Existentially quantified typesは説明する:ハスケルとスカラの普遍的な定量型?

小文字タイプのいずれかの使用は、暗黙的にforallキーワードで始まり、その下に宣言しているようなマップには2つの型宣言は、等価です:

id :: a -> a 
id :: forall a . a -> a 

考えますScalaのscala.Predef#identityは、forallに相当します。すなわち、上の2番目の関数であるHaskellのものですか?

+0

私はスケーラはあまりよく分かりませんが、引用と同じではありませんか?私は 'def identity [A](x:A):' A 'が 'forall A'でもあると仮定します。 – Carsten

答えて

6

ありScalaではforall explicitははありませんが、それは明示的なforall sはHaskellで使用されているさまざまな方法への均等あります

  1. ScopedTypeVariablesを有効にするには:必要のない、Scalaの型変数がスコープされているようにデフォルトでは

  2. 実在のタイプの場合:Scalaはそれらを直接サポートします。上位タイプ、関数矢印の下にネストforallを持っているつまりもののため

  3. :この例を考えてみます。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) 
    
+0

私はあなたの第3の点をあまり理解していませんでした。 Haskellの例は次のとおりです。標準の 'Int => Int'よりPoly1のアプローチの利点は何ですか? – Adowrath

+1

@Adowrathこの場合、違いはありません。代わりに、Haskellとは異なり、Scalaも 'Any => Any'を使うことができますが、' def f3(p:Poly1、x:Int、y:Bool)=(f3(x)、f3(y)より正確ではない戻り値の型を与える)。 –

+0

興味深い。実在のタイプでもこれが可能だと思いましたが、私の理解では十分ではなかったようです。ありがとう! – Adowrath

2

それらが明示的に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を使用するように直感的に見えるかもしれませんが、それは次の文の論理等価性を使用して行うことができます。

関連する問題