【问题标题】:Haskell Data Structure not loadingHaskell 数据结构未加载
【发布时间】:2021-02-27 22:18:39
【问题描述】:

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

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

应该是form variable :: type

Lit :: Int -> AE​​p>

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

{-# 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

【问题讨论】:

  • 这个 AST 缺少递归,所以它很弱:一个 AE 只能是一个 int,或者是两个 int 的加减法。例如,你不能代表 1+2+3。

标签: haskell data-structures types


【解决方案1】:

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

{-# Language GADTs #-}

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

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

您的eval 函数还包含一个do 块。尽管MaybeMonad 的一个实例,但您不能像这样使用do 表示法。尤其是 return nothing 部分在这里是有问题的。对于Monad 实例Maybereturn = Just,这意味着return Nothing 将构造一个Maybe (Maybe a)。您可以使用 guards 来定义警卫应该“开火”的条件。

另一个问题是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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2015-08-12
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多