【发布时间】:2017-06-12 08:52:40
【问题描述】:
我的 Prolog 解释器任务中有一个 Haskell 函数
renames :: Rule -> State ExecState [(Term, Term)]
在 Prolog 规则中产生(几乎)变量的替换(这样变量名称在统一期间不会发生冲突)。
这个函数产生的对的形式是(Variable "X", Variable "X_11"),这意味着变量X应该被重命名为X_11等等(重命名的计数器包含在ExecState) 中。
问题是我已经将替换定义为
type Subst = Maybe [(Term, Term)]
这是有道理的,因为有时找不到统一两个术语的替换。 (但总能找到重命名变量的替换。)
我试过了
renames' :: Rule -> State ExecState Subst
renames' rule = Just $ renames rule
但这显然行不通,因为我将State 包装在Just 中,而不是计算结果。
如何将实际的[(Term, Term)] 结果包装在Just 中?我想做的事情有名字吗?
谢谢!
【问题讨论】:
-
Just <$> renames rule工作吗? -
嗯,确实如此:)。我怎么会错过
<$>?谢谢,@瑞恩!如果您遇到麻烦将其发布为答案,我将很乐意接受。 -
您可能希望将
Subst的定义更改为type Subst = [(Term, Term)],然后在可能无法产生替换的操作上使用Maybe Subst,因为您已经发现了@ 987654335@ 不需要Maybe包装器。