Haskell 如何实现在磁盘上保存具有相关名称的单子的功能?

Haskell 如何实现在磁盘上保存具有相关名称的单子的功能?,haskell,Haskell,所以我有一个简单的解析器库(它不解析字符串,但不管什么),我需要解析器有潜在的名称等等。 例如,用户可以使用解析器 space >> space 然后将名称twospace应用于该解析器。然后会将其保存到磁盘(不确定具体如何),以便在应用程序重新运行时重新加载 所以我的问题是: 应将此功能包装在以下内容中: type Name = String newtype NamedParser a = NamedParser (Parser a) Name 或者我对

所以我有一个简单的解析器库(它不解析字符串,但不管什么),我需要解析器有潜在的名称等等。 例如,用户可以使用解析器

   space >> space
然后将名称twospace应用于该解析器。然后会将其保存到磁盘(不确定具体如何),以便在应用程序重新运行时重新加载

所以我的问题是: 应将此功能包装在以下内容中:

    type Name = String
    newtype NamedParser a = NamedParser (Parser a)  Name
或者我对解析器的定义应该从:

    newtype Parser a = Parser { parse :: a -> FilterResult a }
致:

我的直觉在这里担心程序和实现的速度(有时我不想命名解析器等)。 这个问题的一个扩展是,我是否可以允许用户在两次运行时之间将这些新解析器保存在数据文件中。通过这种方式,用户可以构建一个可以加载的工具库

我可以想象这样做的一个好方法是使用一个合适的Writer/Parser二人组将这些内容保存到文件中,然后将生成的Haskell代码添加到我的库中。这类事情是否有一个惯例,或者这就是我应该去做的。TemplateHaskell是更好的选择吗


最后,如何添加和删除这些新的元编程函数​ 高效-有这样的约定吗?

您的基本解析器结构可以有某种名称,您可以使用
>=
来构建解析结构树。当然,您可以序列化该树并将其保存到磁盘。但是你需要某种解析器将其解析回那棵树,我不认为这是完全通用的。考虑<代码>函数> <代码>实例>代码>分析器< /代码>。通过将结果映射到任意复杂函数,我们可以从另一个解析器构造解析器。我们怎么能期望将其序列化?我的印象是,如果你想要一些可序列化的东西,你必须放弃
Functor
/
Applicative
/
Monad
实例,并拥有更多受控的替代品,在预定义类型的“封闭世界”中工作。看起来免费Monad非常有用。你用它构建一个AST,序列化它,保存到磁盘,重新加载,然后通过解释它来“运行”。如果你让你的用户只写,你知道,实际的Haskell呢?在最简单的情况下,它们可以直接命名一些解析器,如
twoSpaces=space>>space
。导入他们的模块,您就可以上路了。另请看。我要感谢你们所有人的回答。原来我没有启用电子邮件通知,所以很抱歉回复太晚。免费单子的想法似乎是最好的选择。为了让每个人都清楚问题的背景,我不希望我的用户接触代码:他们甚至不应该知道语言是什么。我试图允许用户在不了解后端的情况下,使用可视元素构建解析器树。您的基本解析器结构可以有某种名称,您可以使用
>=
来构建解析结构树。当然,您可以序列化该树并将其保存到磁盘。但是你需要某种解析器将其解析回那棵树,我不认为这是完全通用的。考虑<代码>函数> <代码>实例>代码>分析器< /代码>。通过将结果映射到任意复杂函数,我们可以从另一个解析器构造解析器。我们怎么能期望将其序列化?我的印象是,如果你想要一些可序列化的东西,你必须放弃
Functor
/
Applicative
/
Monad
实例,并拥有更多受控的替代品,在预定义类型的“封闭世界”中工作。看起来免费Monad非常有用。你用它构建一个AST,序列化它,保存到磁盘,重新加载,然后通过解释它来“运行”。如果你让你的用户只写,你知道,实际的Haskell呢?在最简单的情况下,它们可以直接命名一些解析器,如
twoSpaces=space>>space
。导入他们的模块,您就可以上路了。另请看。我要感谢你们所有人的回答。原来我没有启用电子邮件通知,所以很抱歉回复太晚。免费单子的想法似乎是最好的选择。为了让每个人都清楚问题的背景,我不希望我的用户接触代码:他们甚至不应该知道语言是什么。我试图允许用户在不了解后端的情况下,使用可视元素构建解析器树。
    newtype Parser a = Parser { parse :: a -> FilterResult a 
                                   , name :: Name }