我无法理解如何在Haskell中定义一个表示HTTP Multipart MIME POST的递归特性的类型。
在英语中,帖子可以是标题列表以及某种类型的内容,也可以是包含其他帖子内容的标题列表。但内容也可以是帖子列表。
所以我已经定义了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#和一种命令式的风格。我欢迎支持功能性解决方案的任何智慧或方向!
答案 0 :(得分: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。