2017-01-16 2 views
0

私はType-Level Programming in Scalaに従っています。Scalaのタイプレベルコンピューティングでのテスト

私はメッセージ

Error:(26, 16) value && is not a member of object A$A146.this.False 
assert((False && False) == False) 
      ^

がで間違っているものを私に誰にもしてください教えてもらえましテスト

assert((False && False) == False) 

を実行しようとすると、私は以下のコード

sealed trait Bool { 
    type && [b <: Bool] <: Bool 
    type || [b <: Bool] <: Bool 
    type IfThenElse[B, T <: B, F <: B] <: B 
} 

object True extends Bool { 
    type && [B <: Bool] = B 
    type || [B <: Bool] = True.type 
    type IfThenElse[B, T <: B, F <: B] = T 
} 

object False extends Bool { 
    type && [B <: Bool] = False.type 
    type || [B <: Bool] = B 
    type IfThenElse[B, T <: B, F <: B] = F 
} 

type True = True.type 
type False = False.type 

を得ましたそのコード?私は * .scファイルとしてコードを実行しています。 (私はScalaの新機能です)

+0

私は私の答えを削除するように要求しました。 14ページのテストは5ページのコード用です(13ページのコードのテストは17ページを参照)。ドキュメント全体を慎重に検討する必要があります。 – mixel

+0

ありがとうございました@Mmixel for ur help –

答えて

5

2つの問題があります。

まず、型が値であるかのように型を比較す​​ることはできません。 ==は実行時のメソッドなので、たとえそれが動作したとしても、型レベルでの処理の目的を無効にします。あなたはになりますA =:= BA <: BoolB <: Boolの暗黙の証拠を探しています。

第2に、タイプメンバーにインフィックス表記を使用できないため、False && FalseFalse.&&[False]と記述する必要があります。少なくともあなたはそれを定義しています。中置型は、2つのパラメータ、たとえばtype &&[A, B]

のような型として定義されている場合にのみ機能します。次に、いくつかの計算を試してみましょう。ここでは、正常解決するものもある。

scala> implicitly[False.&&[False] =:= False] 
res9: =:=[False.&&[False],False] = <function1> 

scala> implicitly[False.&&[False] =:= False] 
res12: =:=[False.&&[False],False] = <function1> 

scala> implicitly[False.&&[True] =:= False] 
res13: =:=[False.&&[True],False] = <function1> 


scala> implicitly[True.&&[False] =:= False] 
res15: =:=[True.&&[False],False] = <function1> 

scala> implicitly[True.||[False] =:= True] 
res17: =:=[True.||[False],True] = <function1> 

とそうでないいくつか:

scala> implicitly[False.&&[False] =:= True] 
<console>:20: error: Cannot prove that False.&&[False] =:= True. 
     implicitly[False.&&[False] =:= True] 
       ^

scala> implicitly[(False && False) =:= True] 
<console>:20: error: not found: type && 
     implicitly[(False && False) =:= True] 
         ^

scala> implicitly[True.||[False] =:= False] 
<console>:19: error: Cannot prove that True.||[False] =:= False. 
     implicitly[True.||[False] =:= False] 
       ^

scala> implicitly[True.&&[True] =:= False] 
<console>:20: error: Cannot prove that True.&&[True] =:= False. 
     implicitly[True.&&[True] =:= False] 
       ^
+0

マイケルありがとう! –

関連する問題