Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Haskell代码转换为Agda_Haskell_Agda - Fatal编程技术网

将Haskell代码转换为Agda

将Haskell代码转换为Agda,haskell,agda,Haskell,Agda,我们必须将此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`

我们必须将此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类型函数的有效参数时就不是了”。我认为该集合需要更改为其他集合,但我不清楚该更改为什么。

让我们将Haskell中的
BoolProp
声明与Agda版本进行比较:

data BoolProp :: * -> * where
  -- ...
从Haskell的观点来看,
BoolProp
是一元类型构造函数(大致意思是:给我一个具体类型
*
,我给你一个具体类型)

在构造函数中,
BoolProp
本身是没有意义的-它不是一种类型!您必须首先给它一个类型(例如,在
PTrue
的情况下为
TRUE

在Agda代码中,您声明
BoolProp
位于
Set
(类似于Haskell中的
*
)。但是你的构造器讲述了一个不同的故事

ptrue : BoolProp true
通过将
BoolProp
应用于
true
,您就知道
BoolProp
应该接受一个
Bool
参数并返回一个
Set
(即
Bool→ 设置
)。但是你刚才说,
BoolProp
Set

显然,因为
Bool→ 设置≠ 设置
,Agda抱怨

更正相当简单:

data BoolProp : Bool → Set where
  -- ...
现在因为
BoolProp-true:Set
,一切都很好,Agda很高兴


实际上,您可以将Haskell代码做得更好一点,这样您就可以立即看到问题

{-# LANGUAGE GADTs, KindSignatures, DataKinds, TypeFamilies #-}
module Main where

type family And (a :: Bool) (b :: Bool) :: Bool
type instance And True  b = b
type instance And False b = False

type family Or (a :: Bool) (b :: Bool) :: Bool
type instance Or True  b = True
type instance Or False b = b

type family Not (a :: Bool) :: Bool
type instance Not True  = False
type instance Not False = True

data BoolProp :: Bool -> * where
  PTrue  :: BoolProp True
  PFalse :: BoolProp False
  PAnd   :: BoolProp a -> BoolProp b -> BoolProp (And a b)
  POr    :: BoolProp a -> BoolProp b -> BoolProp (Or a b)
  PNot   :: BoolProp a -> BoolProp (Not a)