Haskell数据结构未加载

我正在尝试建立一个数据结构,它是 lambda 演算的扩展,以允许加法和减法。我正在尝试创建一个称为 AE 的结构,它可以将 Lit 作为其本身,也可以计算加法和减法。我收到的错误说明如下:

无效的类型签名:Lit :: ...

应该是变量 :: 类型

点亮 :: Int -> AE

我对这个数据结构的声明有什么问题?

{-# Language GADTs #-}
data AE where
Lit :: Int -> AE
Add :: Int -> Int ->  AE
Sub :: Int -> Int ->  AE

deriving (Show)


eval  ::  AE ->  Maybe Int
eval (Lit n) = Just n
eval (Add n1 n2) = n1 + n2
eval (Sub n1 n2) = do
                      if(n1<n2) then return nothing
                      else return n1 - n2

回答

您需要缩进where子句下的数据构造函数,因此:

{-# Language GADTs #-}

data AE where
    Lit :: Int -> AE
    Add :: Int -> Int -> AE
    Sub :: Int -> Int -> AE

否则,您将定义一个AE 没有任何数据构造函数的类型。如果它是缩进的,那么它就是data AE where块的一部分,因此您定义了三个数据构造函数。

您的eval函数还包含一个do块。虽然Maybe是 的一个实例Monad,但您不能使用那样的do符号。尤其是这return nothing部分是有问题的。对于Monad实例Maybe, return = Just, 所以这意味着return Nothing将构造一个Maybe (Maybe a). 您可以使用警卫来定义警卫应该“开火”的条件。

另一个问题是n1 + n2。这具有 type Int, not Maybe Int,因此您需要将其包装到Just数据构造函数中:

eval :: AE ->  Maybe Int
eval (Lit n) = Just n
eval (Add n1 n2) = Just (n1 + n2)
eval (Sub n1 n2)
    | n1 < n2 = Nothing
    | otherwise = Just (n1 - n2)


以上是Haskell数据结构未加载的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>