2014-11-16 1 views
0

Я не могу окунуться в голову, как определить тип в Haskell, который представляет рекурсивный характер HTTP Multipart MIME POST.Определение многостраничной почты HTTP как рекурсивного типа данных в Haskell

На английском языке Почта представляет собой либо список заголовков вместе с Контентом какого-либо типа, либо список Заголовков с Контентом другой Почты. Но контент также может быть списком сообщений.

Так я определил Header таким образом:

data Header = Header { hName :: String 
        , hValue :: String 
        , hAddl :: [(String,String)] } deriving (Eq, Show) 

Я думаю Content должно быть что-то вроде:

data Content a = Content a | [Post] deriving (Eq, Show) 

Очевидно, что терпит неудачу: parse error in constructor in data/newtype declaration: [Post]

Я определил, как Post :

data Post = Post { pHeaders :: [Header] 
       , pContent :: [Content] } deriving (Eq, Show) 

Я использую Haskell, чтобы получить другую перспективу в моей текущей задаче, последний вопрос на котором: here. Просто используя String для Content, я могу разобрать простые POST с помощью Parsec. Но цель состоит в том, чтобы анализировать сложные сообщения.

Ссылка выше и ссылки, найденные в этом вопросе, дают контекст для моей текущей задачи. Я поклонник Haskell, поэтому, пожалуйста, не стесняйтесь предлагать альтернативы коду, который я разместил здесь, - я не женат на этом, и я бы хотел учиться. В конечном счете, я буду использовать F #, если я не смогу выполнить поставку, и в этом случае я буду вынужден использовать C# и императивный стиль. Я приветствую любую мудрость или направление, поддерживающее функциональное решение!

ответ

1

Ваши типы данных имеют смысл, ваш синтаксис просто неправильно:

data Content a = Content a | Posts [Post a] deriving (Eq, Show) 

Вы можете назвать Posts конструктор, что вам нравится. Тем не менее, вы не можете иметь что-то вроде pContent :: [Content] - поскольку содержание имеет переменную типа, он должен быть применен к типу:

data Post a = Post { pHeaders :: [Header] 
        , pContent :: [Content a] } deriving (Eq, Show) 

Я бы сказал, что ваш подход идиоматическое Haskell.

 Смежные вопросы

  • Нет связанных вопросов^_^