[英]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.