[英]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
块。 虽然Maybe
是Monad
的一个实例,但你不能像那样使用do
表示法。 尤其是return nothing
部分在这里是有问题的。 对于Monad
实例Maybe
, return = 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.