繁体   English   中英

Haskell 数据结构未加载

[英]Haskell Data Structure not loading

我正在尝试设置一个数据结构,它是 lambda 微积分的扩展,以允许加法和减法。 我正在尝试创建一个名为 AE 的结构,它可以将 Lit 作为自身,也可以评估加法和减法。 我得到的错误说明如下:

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

应该是形式 variable:: type

点亮:: 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 function 还包含一个do块。 虽然MaybeMonad的一个实例,但你不能像那样使用do表示法。 尤其是return nothing部分在这里是有问题的。 对于Monad实例Maybereturn = Just ,这意味着return Nothing将构造一个Maybe (Maybe a) 您可以与警卫一起定义警卫应该“开火”的条件。

另一个问题是n1 + n2 这具有类型Int ,而不是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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM