Структурата на данните на Haskell не се зарежда

Опитвам се да настроя структура от данни, която е разширение на ламбда смятането, за да позволи добавяне и изваждане. Опитвам се да създам структура, наречена AE, която може или да има Lit като себе си, или да оценява събиране и изваждане. Грешката, която получавам, казва, че следното:

Невалиден тип подпис: Свети :: ...

Трябва да е от тип променлива ::

Осветен :: 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

person God_of_TecSing    schedule 27.02.2021    source източник
comment
Този AST няма рекурсия, така че е много слаб: AE може да бъде само int или добавяне или изваждане на две int. Не можете да представите 1+2+3, например.   -  person amalloy    schedule 28.02.2021


Отговори (1)


Трябва да отстъпите конструкторите на данни под клаузата where, така че:

{-# Language GADTs #-}

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

в противен случай вие дефинирате тип AE без конструктори на данни. Ако е с отстъп, значи е част от блока data AE where и по този начин дефинирате три конструктора на данни.

Вашата eval функция също съдържа 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)
person Willem Van Onsem    schedule 27.02.2021