我们必须将此haskell数据类型转换为agda代码:
data TRUE
data FALSE
data BoolProp :: * -> * where
PTrue :: BoolProp TRUE
PFalse :: BoolProp FALSE
PAnd :: BoolProp a -> BoolProp b -> BoolProp (a `AND` b)
POr :: BoolProp a -> BoolProp b -> BoolProp (a `OR` b)
PNot :: BoolProp a -> BoolProp (NOT a)
这是我到目前为止所做的:
module BoolProp where
open import Data.Bool
open import Relation.Binary.PropositionalEquality
data BoolProp : Set wheree
ptrue : BoolProp true
pfalse : BoolProp false
pand : (X Y : Bool) -> BoolProp X -> BoolProp Y -> BoolProp (X ? Y)
por : (X Y : Bool) -> BoolProp X -> BoolProp Y -> BoolProp (X ? Y)
pnot : (X : Bool) -> BoolProp X -> BoolProp (not X)
但是我收到了这个错误:“Set应该是一个函数类型,但是当检查true是类型为Set的函数的有效参数时”。我认为Set需要改为其他东西,但我对这应该是什么感到困惑。
答案 0 :(得分:14)
让我们将Haskell中的BoolProp
声明与Agda版本进行比较:
data BoolProp :: * -> * where
-- ...
从Haskell的角度来看,BoolProp
是一个一元类型的构造函数(大致意思是:给我一个具体的类型*
,然后我给你一个具体的类型)。
在构造函数中,BoolProp
单独没有意义 - 它不是一种类型!你必须先给它一个类型(TRUE
,例如PTrue
。)
在您的Agda代码中,您声明BoolProp
位于Set
(类似于Haskell中的*
)。但是你的构造者讲的是另一个故事。
ptrue : BoolProp true
通过将BoolProp
应用于true
,您告诉BoolProp
应该采用Bool
参数并返回Set
(即{{1} }})。但你刚才说Bool → Set
在BoolProp
!
显然,因为Set
,Agda抱怨。
更正非常简单:
Bool → Set ≠ Set
现在因为data BoolProp : Bool → Set where
-- ...
,一切都很好,Agda很高兴。
你实际上可以让Haskell代码更好一些,你马上就会看到问题!
BoolProp true : Set