【发布时间】:2014-06-16 20:08:59
【问题描述】:
我是 Haskell 新手。我正在尝试在 Haskell 中创建一种迷你语言,如果可能的话,我希望有一个名为opp(“相反”的缩写)的高阶函数,它将许多熟悉的函数转换为它们明显的对立面。例如,opp succ 将是函数 pred,opp head 将是 last,等等。对于将一个函数转换为它的对立面意味着什么,我没有一些一般的定义:我只想挑选几个关键的例子并声明它们的对立面是什么。所以我想要一个几乎从未定义过的高度多态的函数。
困难似乎在于我想通过它们的名称而不是它们的本质来识别功能(可以这么说)。这种困难的一种表现是,如果我写了
opp succ = pred
然后 Haskell 将 succ 视为一个变量,因此给了我一个常量函数,它总是取值 pred。我真正想说的是,“如果您看到字符串opp succ,那么将其视为pred 的另一个名称。”但是在搜索了很长一段时间后,我不知道该怎么做(如果可能的话)。
总而言之,我想定义一个函数
opp :: (a -> b) -> (a -> b)
通过说类似的话
opp succ = pred
opp pred = succ
opp head = last
opp last = head
并在我喜欢的时候添加到此列表中。显然我不能那样做,但是有没有一些不可怕的方法可以达到同样的效果?
【问题讨论】:
-
好的。但这个“对立面”的概念在当时似乎确实相当模糊。
-
这就是重点。因为“相反”没有一个很好的定义,所以我想根据具体情况来定义它。
-
@user15553 那么为什么会有“对立面”呢?此时您可以拥有
oppPred = succ,并且您不会失去与您在问题中指定的内容相关的表达能力。 -
这是因为在迷你语言中能够将
opp本身视为一个抽象概念很重要,因此在某种意义上succ和pred之间的关系是“与head和last之间的关系相同”。这样做的一个(不是唯一的)优点是我可以使用它来构造其他函数,例如oppPair f = (f, opp f),而不必以基本相同的方式构造许多类似的函数。
标签: haskell