簡體   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