2014-11-16 42 views
0

我無法圍繞如何在Haskell中定義表示HTTP多部分MIME POST的遞歸性質的類型。在Haskell中將HTTP多部分帖子定義爲遞歸數據類型

在英文中,帖子可以是頭部列表以及某種類型的內容,也可以是包含其他帖子內容的頭部列表。但內容也可以是帖子列表。

所以我定義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,我就可以使用Parsec解析簡單的POST。但目標是解析複雜的帖子。

上面的鏈接以及在該問題中找到的鏈接爲我當前的任務提供了上下文。我是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) 

我要說的是,你的做法是地道哈斯克爾。

相關問題