Структура данных Haskell не загружается

Я пытаюсь настроить структуру данных, которая является расширением лямбда-исчисления, чтобы разрешить сложение и вычитание. Я пытаюсь создать структуру под названием AE, которая может либо иметь Lit как таковую, либо оценивать сложение и вычитание. Ошибка, которую я получаю, говорит о следующем:

Недопустимая подпись типа: Lit :: ...

Должна быть переменной формы :: type

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 может быть только целым числом или сложением или вычитанием двух целых чисел. Например, вы не можете представить 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