Haskell中的通用函数组合

6

我正在阅读这里,我注意到如果我有以下函数定义:

a :: Integer->Integer->Integer
b :: Integer->Bool

以下表达式是无效的
(b . a) 2 3

很奇怪的是,组合函数的功能必须只有一个参数。

这个限制是因为在Haskell中定义最通用的函数时存在一些问题,还是因为其他原因呢?

我是Haskell的新手,所以也许问了一些无用的问题。

1个回答

7
当你执行 a 2 3 时,你并不是将 a 应用于两个参数。实际上,你是将 a 应用于它唯一的参数,生成一个函数,然后将该函数应用于 3。因此,你实际上进行了两次应用。所以在某种程度上,你所拥有的不等同于这个:
a :: (Integer, Integer) -> Integer
b :: Integer -> Integer
(b . a) (2, 3)

你本来可以这样做的,顺便说一下。
(b . a 2) 3

如果a有Integer->Integer->Integer->Integer类型,我该如何设置第三个参数,并让其他两个参数“可变”? - hsknew
你可以这样做(b . a 1 2) 3。关键是由a产生的“东西”必须在b的域内(或者粗略地说,是相同类型的)。 - Phil
1
PS:在这里,我们不是组合 ab。我们是组合 a 1 2b,只是为了明确。 - Phil
是的,我猜这是因为函数的currlness(?)定义造成的。(而且“even”也没有其他选择) - hsknew
@hsknew:将多参数函数替换为高阶函数和多个应用程序的术语称为“柯里化”,这是你要找的词吗?如果有帮助的话,它是以逻辑学家Haskell Curry的名字命名的。 - C. A. McCann
3
同时,您可以使用原始的 ab 函数,并将前者进行“uncurry(反柯里化)”处理。 (b . uncurry a) (2, 3) - Dan Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接